Я изучаю минимальные API (а также все еще изучаю C#), но просто застрял при создании модульных тестов. Учитывая эту функцию:
public IResult GetGenderById(Guid id)
{
var gender = this.repository.Get(id);
if (gender != null)
{
return Results.Ok(gender);
}
return Results.NotFound();
}
Я могу легко утвердить IResult, например: Assert.That(result, Is.InstanceOf<Ok<GenderData>>()); или Assert.That(result, Is.InstanceOf<NotFound>());.
Однако, если бы мне пришлось вернуть сообщение с NotFound, я внезапно не смог бы подтвердить этот IResult благодаря анонимному типу:
public IResult GetGenderById(Guid id)
{
var gender = this.repository.Get(id);
if (gender != null)
{
return Results.Ok(gender);
}
return Results.NotFound(new { Message = "No 'Gender' found with the given ID." });
}
Одно из решений, которое я нашел, — вместо этого запустить интеграционные тесты, где я могу напрямую проверить возвращаемый JSON, но я надеюсь выполнить модульное тестирование этого метода, а затем запустить интеграционные тесты. Я не могу найти в Интернете много ресурсов, посвященных минимальным API (по сравнению с MVC и контроллерами).
Спасибо!





Если вы не хотите вводить тип результата (хотя с record это очень просто, и я бы пошел этим путем), у вас есть несколько обходных путей.
Вы можете проверить код состояния:
var sutResult = Results.NotFound(new { Message = "No 'Gender' found with the given ID." });
Assert.That(sutResult, Is.AssignableTo<IStatusCodeHttpResult>());
Assert.That((sutResult as IStatusCodeHttpResult).StatusCode,Is.EqualTo((int)HttpStatusCode.NotFound));
Или используйте некоторое отражение:
Assert.That(sutResult.GetType().GetGenericTypeDefinition(), Is.EqualTo(typeof(NotFound<>)));
Вероятно, в сочетании с утверждениями на основе отражения (может потребоваться удалить предупреждения):
Assert.That(sutResult, Has.Property("Value").Property("Message").Contains("Gender"));
Я надеялся не вводить больше записей (и сохранить API как можно более минимальным и простым), но это, кажется, самый простой ответ. Спасибо!