Хорошая практика предполагает, что в ваших действиях контроллера нет большого количества кода для тестирования, а основная часть логики находится в разъединенных объектах в других местах, которые гораздо проще тестировать.Сказав это, если вы все еще хотите проверить свои контроллеры, то вам нужно сделать свой тест async
и ждать вызовов.
Одна из проблем, с которыми вы столкнетесь, заключается в том, что вы используете IActionResult
какпозволяет вернуть BadRequest(...)
и Ok(...)
.Однако, поскольку вы используете ASP.NET MVC Core 2.1, вы можете вместо этого начать использовать новый тип ActionResult<T>
.Это должно помочь в тестировании, поскольку теперь вы можете получить прямой доступ к строго типизированному возвращаемому значению.Например:
//Assuming your return type is `Configuration`
public async Task<ActionResult<Configuration>> GetConfiguration([FromRoute] int? id)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
..... // Some code here
// Note we are now returning the object directly, there is an implicit conversion
// done for you
return configuration;
}
catch (Exception ex)
{
... // Some code here
}
}
Обратите внимание, что теперь мы возвращаем объект напрямую, поскольку существует неявное преобразование из Foo
в ActionResult<Foo>
Теперь ваш тест можетвыглядеть так:
[TestMethod]
public async Task ConfigurationSearchGetTest()
{
var context = GetContextWithData();
var controller = new ConfigurationSearchController(context);
var items = context.Configurations.Count();
// We now await the call
var actionResult = await controller.GetConfiguration(12);
// And the value we want is now a property of the return
var configuration = actionResult.Value;
Assert.IsTrue(true);
context.Dispose();
}