以下构造函数参数没有匹配的灯具数据

MeP*_*sta 9 .net c# unit-testing xunit .net-core

我正在尝试使用我的控制器进行测试,xUnit但在执行Customer Controller的过程中收到以下错误:

“以下构造函数参数没有匹配的夹具数据:CustomerController customerController”

测试班

public class UnitTest1
{
    CustomerController _customerController;

    public UnitTest1(CustomerController customerController)
    {
        _customerController = customerController;
    }

    [Fact]
    public void PostTestSuccessful()
    {
        Guid guid = Guid.NewGuid();

        CustomerViewModel model = new CustomerViewModel()
        {
            Id = guid,
            Name = "testName",
            Email = "test email",
            PhoneNumber = "test phone",
            Address = "test address",
            City = "test city",
            Gender = "Male"
        };

        var actionResult = _customerController.Post(model);

        Assert.NotNull(actionResult);
        Assert.IsType<Task<IActionResult>>(actionResult);
        Assert.True(actionResult.IsCompletedSuccessfully);
    }
Run Code Online (Sandbox Code Playgroud)

CustomerController类

[Route("customers")]
public class CustomerController : ControllerBase
{
    private readonly ILogger _logger;
    private readonly ICustomerService _customerService;

    public CustomerController(ILogger<CustomerController> logger,
        ICustomerService customerService)
    {
        _logger = logger;
        _customerService = customerService;
    }

    [HttpPost]
    public async Task<IActionResult> Post([FromBody] CustomerViewModel viewModel)
    {
        var customerToBeSaved = viewModel.Adapt<CustomerServiceModel>();

        var customer = await _customerService.SaveAsync(customerToBeSaved);

        var result = customer.Adapt<CustomerViewModel>();

        return Ok(result);
    }
Run Code Online (Sandbox Code Playgroud)

AQu*_*rky 53

您缺少的是测试类的 IClassFixture 接口。这将解决问题...

public class UnitTest1 : IClassFixture<CustomerController>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!请解释一下原因? (12认同)
  • @vicNeo,原因解释如下:https://xunit.net/docs/shared-context。xUnit 使用 IClassFixture 作为它需要创建和清理类固定装置的提示。这是接口的非标准使用。这就是为什么这个特定的错误如此难以诊断。实现和错误消息都难以理解。 (2认同)

Blu*_*ron 9

这篇文章展示了如何让 xunit 很好地与 .Net Core ASP.Net 一起工作。它实际上取代了启动,以便您的控制器在同一进程中运行,您可以像在本地一样测试它们。

https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests

它允许您的标准 .Net 依赖注入正常工作。此外,它具有不作为服务器运行的惊人好处,它伪造了整个启动过程,以便它在单个进程中运行,您可以一直调试。这也是你应该这样做的方式,因为微软是这么说的。

从文章底部的论坛中可以获得更多帮助。

  • 谢谢你的解释。很有帮助。将它们复制到您的答案中,我保证我会投票。仅提供链接有时对于答案来说太短,特别是当链接的文章很长时。 (2认同)
  • 现在是不是看起来好多了?我编辑并投票了您的答案,请在您以后的答案中更具描述性。不要假设每个人都知道你所知道的。 (2认同)

小智 8

如果您不想使用任何模拟框架,只需在构造函数中新建 CustomerController。

  • “新的 CustomerController”? (6认同)
  • @DMur 他们的意思是在类构造函数中实例化控制器,例如 `_myPrivateProperty = new CustomerController();` (2认同)

Gau*_*lan 7

对于测试框架,您需要使用模拟库在测试类中通过 DI 注入模拟对象。您可以使用 Nmock、Moq 或任何其他模拟库来设置构造函数注入。

https://www.c-sharpcorner.com/uploadfile/john_charles/mocking-in-net-with-moq/

http://nmock.sourceforge.net/quickstart.html