首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Asp.Net MVC Web Api中测试控制器时,ModelState.IsValid始终为真

在Asp.Net MVC Web Api中测试控制器时,ModelState.IsValid始终为真
EN

Stack Overflow用户
提问于 2016-06-01 09:27:34
回答 5查看 5.9K关注 0票数 16

我尝试过这样做,做了很多google/stackoverflow搜索,但都没有成功。

我有一个简单的模型:

代码语言:javascript
复制
public class MovieModel
{
    public string Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }
}

控制器中的一种方法:

代码语言:javascript
复制
// POST: api/Movies
public IHttpActionResult Post([FromBody]MovieModel movieModel)
{
    if (ModelState.IsValid)
    {
        //Code
    }
}

以及一个测试方法(是集成测试,但在单元测试中也会发生同样的情况):

代码语言:javascript
复制
[TestMethod]
public void MoviesController_Post_Without_Name()
{
    // Arrange
    var model = new MovieModel();
    model.Name = "";

    // Act
    var result = controller.Post(model);

    // Assert
    Assert.IsInstanceOfType(result, typeof(InvalidModelStateResult));
    Assert.AreEqual(6, controller.Get().Count());
}

尽管模型显然是无效的,但它始终将IsValid属性求值为true。

到目前为止,我尝试了许多方法,但都没有成功。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-06-01 11:44:25

您的解决方案可能有效,但更好的方法是使用ApiController.Validate(https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.validate(v=vs.118%29.aspx)方法。

代码语言:javascript
复制
public void MoviesController_Post_Without_Name()
{
    // Arrange
    var model = new MovieModel();
    model.Name = "";

    // Act
    controller.Validate(model);   //<---- use the built-in method
    var result = controller.Post(model);

    // Assert
    Assert.IsInstanceOfType(result, typeof(InvalidModelStateResult));
    Assert.AreEqual(6, controller.Get().Count());
}
票数 9
EN

Stack Overflow用户

发布于 2016-06-01 09:27:34

多亏了this站点,我找到了解决方案:

代码语言:javascript
复制
private void SimulateValidation(object model)
{
    // mimic the behaviour of the model binder which is responsible for Validating the Model
    var validationContext = new ValidationContext(model, null, null);
    var validationResults = new List<ValidationResult>();
    Validator.TryValidateObject(model, validationContext, validationResults, true);
    foreach (var validationResult in validationResults)
    {
        this.controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
    }
}

并在测试方法中包含一行代码,如下所示:

代码语言:javascript
复制
public void MoviesController_Post_Without_Name()
{
    // Arrange
    var model = new MovieModel();
    model.Name = "";

    // Act
    SimulateValidation(model);
    var result = controller.Post(model);

    // Assert
    Assert.IsInstanceOfType(result, typeof(InvalidModelStateResult));
    Assert.AreEqual(6, controller.Get().Count());
}

希望这能帮助到一些人,它能帮我省下上网的时间。

票数 11
EN

Stack Overflow用户

发布于 2019-04-05 00:21:46

在WebAPI 5.2.7上:

代码语言:javascript
复制
[TestMethod]
public void MoviesController_Post_Without_Name()()
{
    // Arrange
    var model = new MovieModel();
    model.Name = "";

    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();
    controller.Validate(model);

    // Act
    var result = controller.Post(model);

    // Assert
    ...

这篇文章对我很有帮助:https://www.c-sharpcorner.com/article/unit-testing-controllers-in-web-api/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37558049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档