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)
这篇文章展示了如何让 xunit 很好地与 .Net Core ASP.Net 一起工作。它实际上取代了启动,以便您的控制器在同一进程中运行,您可以像在本地一样测试它们。
https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests
它允许您的标准 .Net 依赖注入正常工作。此外,它具有不作为服务器运行的惊人好处,它伪造了整个启动过程,以便它在单个进程中运行,您可以一直调试。这也是你应该这样做的方式,因为微软是这么说的。
从文章底部的论坛中可以获得更多帮助。
小智 8
如果您不想使用任何模拟框架,只需在构造函数中新建 CustomerController。
对于测试框架,您需要使用模拟库在测试类中通过 DI 注入模拟对象。您可以使用 Nmock、Moq 或任何其他模拟库来设置构造函数注入。
https://www.c-sharpcorner.com/uploadfile/john_charles/mocking-in-net-with-moq/
http://nmock.sourceforge.net/quickstart.html