代码之家  ›  专栏  ›  技术社区  ›  Alen Alex

在执行单元测试时,asp.net core中的TryValidateModel引发空引用异常

  •  3
  • Alen Alex  · 技术社区  · 6 年前

    我正在尝试为Asp.Net核心Web API的ModelState验证编写单元测试。

    我读到了,最好的方法是 TryValidateModel 功能。但是,每次我运行单元测试时,它都会抛出空引用异常。
    我发现许多文章建议 controller.ModelState.AddModelError("","") ,但我对此不感兴趣,因为我相信它比实际模型验证的实际目的要好。

    [TestMethod]
    public void TestMethod1()
    {
        var controller = new TestController();
    
        controller.Post(new Model());
    }
    
    
    public class TestController : Controller
    {
        public IActionResult Post(Model model)
        {
            bool b = TryValidateModel(model)
    
            return Ok();
        }
    }
    

    TryValidateModel(model) 始终从引发空引用异常 TryValidateModel(model, prefix) 功能。

    谢谢你的帮助。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Egorikas    6 年前

    这是配置/集成问题。

    你可以在 issue in ASP.NET Core repo another one 在github上。 但我可以告诉你最简单的方法(我用过一次)

            var objectValidator = new Mock<IObjectModelValidator>();
            objectValidator.Setup(o => o.Validate(It.IsAny<ActionContext>(), 
                                              It.IsAny<ValidationStateDictionary>(), 
                                              It.IsAny<string>(), 
                                              It.IsAny<Object>()));
            controller.ObjectValidator = objectValidator.Object;
    
        2
  •  2
  •   Alen Alex    6 年前

    由于@Egorikas的帮助,当我考虑如何修复空引用异常时,我注意到它仍然没有真正验证模型,并且总是返回一个true。

    我发现我们可以 Validator 上课 System.ComponentModel.DataAnnotations 命名空间。

    [TestMethod]
    public void TestMethod1()
    {
        var model = new Person();
        var validationResultList = new List<ValidationResult>();
    
    
        bool b1 = Validator.TryValidateObject(model, new ValidationContext(model), validationResultList);
    }
    

    如果您的目的是进行ModelState验证,则可以直接从测试方法本身验证它,而不必调用控制器。

    希望这有帮助。