使用最小起订量在 xunit 项目中使用参数化构造函数对控制器进行单元测试

Unit testing a controller with parameterized constructor in xunit project using MOQ

提问人:Thameem 提问时间:11/17/2023 最后编辑:Thameem 更新时间:11/21/2023 访问量:37

问:

我正在尝试为我的控制器编写一个 xunit 测试方法来测试 JsonResult。但是由于控制器采用将从 DI 容器注入的参数,因此我不确定如何以及在何处在我的测试方法中传递此参数。

控制器:

public class AppGuidelinesController : Controller
{
    private IAppGuidelineBLRepository appGuidelineRepos;

    public AppGuidelinesController(IAppGuidelineDBRepository dataRepos)
    {
        appGuidelineRepos = new AppGuidelineBLRepository(dataRepos);
    }
}

测试方法

[Fact]
public void GetJsonData_Returns_JsonResult()
{
    // Arrange
    Mock<IAppGuidelineDBRepository> dbReposMock = new Mock<IAppGuidelineDBRepository>();

    var appGuideline = new AppGuideline()
    {
        Id = 1
    };

    dbReposMock.Setup(repo => repo.AddGuideline(appGuideline));

    var controller = new AppGuidelinesController(dbReposMock.Object);

    var mockControllerContext = new Mock<ControllerContext>();
    controller.ControllerContext = mockControllerContext.Object;

    AppGuidelineRequestModel appGuidelineRequestModel = new AppGuidelineRequestModel()
    {
        Id = 1
    };

    OperationStatus expectedOperationStatus = new OperationStatus
    {
        StatusType = hrlib_test.Enums.StatusType.Success
    };

    // Act
    var result = controller.AddGuideline(appGuidelineRequestModel);


    // Assert
    Assert.NotNull(result);
    Assert.IsType<JsonResult>(result);

    var actualOperationStatus = result.Value as OperationStatus;
    Assert.NotNull(actualOperationStatus);
    Assert.Equal(expectedOperationStatus.StatusType, actualOperationStatus.StatusType);
}

当我运行测试时,出现以下错误

System.ArgumentException:无法传递构造函数参数 接口模拟。

请帮助我解决此问题并继续使用其他方法。谢谢。

C# ASP.net-core-6.0 xunit.net

评论

0赞 DavidG 11/17/2023
为什么要首先在控制器中创建一个新的控制器?那也应该注射。AppGuidelineBLRepository
0赞 Thameem 11/17/2023
这只是我不想在 DI 注册的商务舱
1赞 DavidG 11/17/2023
这确实是很糟糕的做法,所有的业务逻辑都应该注入。
0赞 Thameem 11/17/2023
明白了。谢谢你的建议。让我考虑一下。你能帮我解决这个问题吗?
0赞 DavidG 11/17/2023
不,我无法帮助您解决这里的问题,我不确定此代码是否真的会给您带来您所说的错误。你确定这是你的实际代码吗?

答:

-1赞 Thameem 11/20/2023 #1

似乎我忘了从构造函数中删除一段测试代码,这会导致实际错误而不是测试方法。删除它后,测试通过了。我从这个链接中找到了一些帮助 => 无法为接口模拟传递构造函数参数

enter image description here