Почему мой ModelState действителен, если я передаю объект без значения для требуемого свойства? [Дубликат]

Вы можете сохранить их в задачах, а затем ждать их всех:

var catTask = FeedCat();
var houseTask = SellHouse();
var carTask = BuyCar();

await Task.WhenAll(catTask, houseTask, carTask);

Cat cat = await catTask;
House house = await houseTask;
Car car = await carTask;
23
задан abatishchev 31 August 2013 в 17:58
поделиться

3 ответа

Причина, по которой состояние модели действительна, заключается в том, что при новом обновлении контроллера создается новое состояние модели. Web API не выполняет привязки параметров для вас здесь, поэтому у него даже нет возможности добавлять ошибки состояния модели.

Если вы хотите сохранить это как единичный тест, тогда вы должны добавить

Если вы хотите проверить, что состояние модели недействительно в реальном запросе, я рекомендую вам прочитать это сообщение в блоге:

http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx

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

25
ответ дан Youssef Moussaoui 18 August 2018 в 23:54
поделиться

TL; DR Если вы не хотите читать всю статью, предоставленную Youssef, и хотите быстро решить, как заставить ModelState.IsValid вернуть false. Сделай это.

[TestMethod]
public void TestLogin_InvalidModel()
{
    AccountController controller = CreateAccountController();
    // new code added -->
    controller.ModelState.AddModelError("fakeError", "fakeError");
    // end of new code
    ...
    var response = controller.PostLogin(new LoginModel() {  });

    Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);

}

Теперь я могу представить, что CreateAccountController () выглядит примерно так: минимум ->

return new AccountApiController()
{
    Request = new HttpRequestMessage(),
    Configuration = new HttpConfiguration()
};

Надеюсь, что это даст быстрый ответ для этих поисковых запросов:)

18
ответ дан Andreas 18 August 2018 в 23:54
поделиться
  • 1
    Спасибо за пример. Единственное отличие, которое я сделал, это тип assert: Assert.IsInstanceOfType (actResult, typeof (InvalidModelStateResult)); – Mateusz Migała 17 January 2017 в 09:38

Как уже упоминалось ранее, вам нужны интеграционные тесты для проверки модели ModelState. Итак, с Asp.Net Core, я копаю этот вопрос, чтобы добавить простое решение для интеграции тестов с Asp.Net Core и проверки ModelState

. Добавьте пакет Microsoft.AspNetCore.TestHost, и вы можете отправлять запросы simple:

var server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
var client = server.CreateClient();
var model = new { Name = String.Empty };
var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
var result = await client.PostAsync("/api/yourApiEndpoint", content);
result.StatusCode.Should().Be(HttpStatusCode.BadRequest);

Вы можете найти более подробную информацию об этом здесь: http://asp.net-hacker.rocks/2017/09/27/testing-aspnetcore.html

Надеюсь, что это поможет.

6
ответ дан Bruno Avelar 18 August 2018 в 23:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: