Из того, что я видел и читал, лучший способ модульного тестирования функции контроллера - это создать экземпляр хоста сервера из вашей тестовой настройки и делать запросы непосредственно к вашей конечной точке - это позволит вам протестировать транспортный уровень ваше приложение, такое как контракт API и протоколы Http. Ниже приведен пример, реализованный в. Net Core:
[Trait]
public class CategoryControllerTests : IClassFixture<WebApplicationFactory<Startup>>
{
// Startup - the entry point of most .net core project
private readonly WebApplicationFactory<Startup> _factory;
public CategoryControllerTests(WebApplicationFactory<Startup> factory)
{
// Any webhost config needed to run tests against the test
_factory = factory.WithWebHostBuilder(builder =>
{
builder.ConfigureTestServices(services =>
{
// register any mock dependancies there - any dependencies in Startup.cs will hold unless overridden by a mock
services.AddScoped(x => new Mock() );
});
});
}
[Fact]
public async Task Get_ValidRequest_ReturnsData()
{
var client = _factory.CreateClient();
// Whatever routing protocol you use to define your endpoints
var url = "/category";
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsAsync<List<Category>>();
// Any asserts on your response
Assert.NotNull(content);
}
}
Это зависит от того, как вы настроили запуск / инициализацию вашего проекта, это позволит вам протестировать проект, как если бы он был работает в производственной среде, позволяя вам имитировать любые зависимости ниже транспортного уровня для истинного модульного теста.
Примечание: использование IClassFixture - это позволит вам повторно использовать экземпляр WebApplicationFactory для более быстрого выполнения теста; XUnit внедрит это за вас как часть фреймворка.