Как я могу проверить модульное тестирование модели в контроллерах, украшенных [ApiController]? - PullRequest
0 голосов
/ 16 октября 2018

Как указано в этот ответ от до Asp.Net Core 2.1 ApiController не выполняет автоматическую проверку модели при модульном тесте , автоматическую проверку ModelState, что в ApiControllerAttribute в ASP.NET Core 2.1дает нам работу только тогда, когда фактически запрашивает действие во время выполнения, не вызывая его с недопустимым параметром в модульном тесте.

Однако я все еще хочу проверить, действительно ли мое действие возвращает BadRequestResult при предоставлении неверной модели.Есть ли способ сделать это?Я получаю, что все еще могу вручную проверить, если ModelState.IsValid имеет значение false, и сам возвращаю BadRequest (), но такой тип не дает возможности автоматической проверки.

Я застрял вручную, проверяя ModelState.IsValid после всех, или есть ли способ использовать новую проверку модели ApiControllerAttribute в модульном тесте?

1 Ответ

0 голосов
/ 16 октября 2018

Если вы хотите проверить, что API возвращают неверный запрос, когда аннотации данных нарушены, вам нужно выполнить интеграционный тест API.Один хороший вариант - запустить интеграционные тесты через клиент в памяти, используя TestServer

Вот пример:

//arrange
var b = new WebHostBuilder()
    .UseStartup<YourMainApplication.Startup>()
    .UseEnvironment("development");

var server = new TestServer(b) { BaseAddress = new Uri(url) };
var client = server.CreateClient();
var json = JsonConvert.SerializeObject(yourInvalidModel);
var content = new StringContent(json, Encoding.UTF8, "application/json");

//act
var result = await client.PostAsync("api/yourController", content);

//assert
Assert.AreEqual(400, (int)result.StatusCode);

Если вам нужно только убедиться, чточто аннотации настроены правильно, вы можете вручную запустить проверку с помощью метода TryValidateObject

var obj = new YourClass();
var context = new ValidationContext(obj);
var results = new List<ValidationResult>();
var valid = Validator.TryValidateObject(obj, context, results, true);
...