gpt4 book ai didi

c# - 在 Asp.Net MVC Web Api 中测试 Controller 时,ModelState.IsValid 始终为真

转载 作者:可可西里 更新时间:2023-11-01 08:41:14 26 4
gpt4 key购买 nike

我已尝试完成这项工作,并进行了多次 google/stackoverflow 搜索,但一点运气都没有。

我有一个简单的模型:

public class MovieModel
{
public string Id { get; set; }

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

Controller 中的一个方法:

// POST: api/Movies
public IHttpActionResult Post([FromBody]MovieModel movieModel)
{
if (ModelState.IsValid)
{
//Code
}
}

和一个测试方法(是一个集成测试,但同样会发生在单元测试中):

[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。

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

最佳答案

感谢this网站,我找到了解决方案:

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);
}
}

并在测试方法中包含这样一行:

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());
}

希望对某人有所帮助,它可以节省我在网上搜索的时间。

关于c# - 在 Asp.Net MVC Web Api 中测试 Controller 时,ModelState.IsValid 始终为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37558049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com