如何使用FakeItEasy在WebApi控制器上进行集成测试?



我是实现单元测试和集成测试的新手。我正在尝试为我的应用程序编写一些集成测试。 以下是我的应用程序中的代码片段,为您提供我的代码的所有想法。 如果您能为我提供一些指导,那将非常有帮助。

namespace MyApplication.ApiControllers
{
[Authorize]
[RoutePrefix("api/customers")]
[AppExceptionFilter]
public class CustomersController : ApiController
{
private readonly IMediator _mediator;
public CustomersController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet]
[Route("GetCustomer")]
public async Task<IHttpActionResult> GetCustomer(string customerNumber, string customerType = null)
{
var result = await _mediator.RequestAsync(new GetCustomerRequest(customerNumber, customerType));
return Ok(result);
}
}
}

以下是 GetCustomerRequest 处理程序的实现

public async Task<List<Customer>> HandleAsync(GetCustomerRequest request)
{
var result = await customerService.GetCustomer(request.CustomerNumber, request.CustomerType);
// some business logic 
return result;
}

以下是客户服务的实现

public async Task<List<Customer>> GetCustomer(string customerNumber, string customerType = null)
{
using (var dataContext = _dataContextFactory.Invoke())
{
result = await dataContext.Customers
.Where(b => b.CustomerNumber == customerNumber)
.Where(b => b.CustomerType == customerType)
.Select(b => new Customer
{
// Properties assignment...
})
.ToListAsync();
}
return result;
}

下面是我尝试过的集成单元测试。

namespace MyApplication.Tests.Integrations
{
[TestFixture]
public class CustomersControllerTests
{
private string _baseAddress;
private string _username;
private string _password;
private IApiClient _apiClient;
[SetUp]
public void Setup()
{
_baseAddress = "https://mywebaaplication.com"; // TODO get this from a config
_username = "";
_password = "";
_apiClient = new ApiClient(new ApiClientAuthenticationHandler(), _baseAddress);  // REPLACE with AzureADApiClientAuthenticationHandler
}
[Test]
public async Task CustomersController_GetCustomer()
{
var customerNumber = string.Empty;
var customerType = 500;
var result = await _apiClient.GetAsync<Customer[]>($"/api/customers/GetCustomer?customerNumber={customerNumber}&customerType={customerType}");
Assert.IsNotNull(result);
Assert.IsTrue(result?.Length > 0);
}
}
}

你可以做一些事情:

  1. 在单元测试中创建一个虚拟主机,然后对其执行 http 请求
  2. 不是在单元测试中
  3. 测试控制器,而是在活动/准备检查中测试控制器(因为它只是胶水代码(。只需为您的服务进行集成测试即可。
  4. 只需针对"新客户控制器"进行测试

这里没有正确/错误的答案。您只需查看风险,并相应地进行测试。还取决于预期的代码更改类型。有时,仅在新更改的上下文中创建测试是可以的,无需预测所有内容。

最新更新