当前位置: 首页 > 知识库问答 >
问题:

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

濮阳君浩
2023-03-14

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

我读到,最好的方法是使用TryValidateModel函数。但是,每次我运行单元测试时,它都会引发 NullReference 异常
我发现很多文章建议控制器。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(模型)总是从TryValidateModel(模型,前缀)函数抛出Null参考异常。

感谢任何帮助。

共有3个答案

齐思淼
2023-03-14

基于Andrew Van Den Brink的答案,但实际上在ModelState中设置了验证错误。

private class ObjectValidator : IObjectModelValidator
{

    public void Validate(ActionContext actionContext, ValidationStateDictionary validationState, string prefix, object model)
    {
        var context = new ValidationContext(model, serviceProvider: null, items: null);
        var results = new List<ValidationResult>();

        bool isValid = Validator.TryValidateObject(
            model, context, results,
            validateAllProperties: true
        );

        if (!isValid)
            results.ForEach((r) =>
            {
                // Add validation errors to the ModelState
                actionContext.ModelState.AddModelError("", r.ErrorMessage);
            });
    }
}

然后,只需在控制器中设置ObjectValidator:

controller.ObjectValidator = new ObjectValidator();
司寇阳朔
2023-03-14

由于@Egorikas,当我发现如何修复空引用异常时,我注意到它仍然无法实际验证模型,并且总是返回true。

我发现我们可以只在System. ComponentModel. DataAnnoations命名空间中使用Validator类。

[TestMethod]
public void TestMethod1()
{
    var model = new Person();
    var validationResultList = new List<ValidationResult>();


    bool b1 = Validator.TryValidateObject(model, new ValidationContext(model), validationResultList);
}

如果ModelState验证是您的意图,您可以直接从Test方法本身验证它,而不必调用控制器。

希望这有所帮助。

汝彭薄
2023-03-14

这是配置/集成问题。

您可以在ASP.NET Core repo和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;
 类似资料:
  • 但这无济于事,仍然令人崩溃。 我在考虑make try{}catch返回500,并在每个过滤器中进行某种日志记录,但这将导致大量的重复。 有什么办法可以在全球范围内处理吗? MVC服务的添加方式如下:

  • 所以,我需要运行这个单元测试。 服务接口: 所以当我运行这个测试时,它会抛出一个异常,实际上不会在这里断言测试。 我在的顶部添加了,它扩展了 在第二个测试用例中,我得到了空的响应。我试过这个API vis Postman,得到了回复。那里一切正常。 控制器内容: 测试等级: 我错过了什么?

  • 我正在使用ASP.Net核心开发一个网络应用编程接口。我正在对我的项目进行集成测试。我点击这个链接,https://koukia.ca/integration-testing-in-asp-net-core-2-0-51d14ede3968.这是我的代码。 我有控制器要在古德.api项目中进行测试。 我在解决方案中添加了一个名为thegoodyard.tests的新单元测试项目。我添加了一个具有以

  • 问题内容: 我编写了一个转换器类,该类使用并将其转换为另一个类型,该类型包含指向Servlet请求的InputStream的指针。(其想法是从请求处理中抽象传入的传输协议,因此,例如,我也可以从FTP编写类似的转换器。) 现在,我正在尝试为此编写单元测试,但遇到了问题。我设法找出正确的样板来创建一个有效的Multipart HTTP请求(使用Spring类和),但是现在我在类的方法中得到了。我猜的

  • 我正在尝试通过Maven运行cucumber+testng+selenium。 当我在Eclipse中通过TestNG测试运行它时,它工作得很好,但当我使用mvn测试时,它会抛出空指针异常 我是不是漏掉了什么?

  • 我正在尝试将ASP.NET MVC webform迁移到ASP.NET核心MVC。当前,类遇到问题。 原来的行是: 但是,对于ASP.NET核心,UrlReferrer不可用。我发现了以下内容: 它返回StringValues而不是String。我不确定我是否应该尝试使用这一个,或者是否有任何其他解决办法来解决这种情况。也不可用,或者我没有该命名空间。我的命名空间如下: 如果有人能指引我正确的方向

  • 在我的asp.net核心项目(与2017年相比)中,我想运行我的测试方法,但在测试资源管理器中单击“运行所有”,我在测试资源管理器控制台中得到“最后一次测试运行不运行(总运行时间“布拉布拉”)”响应。我已经下载了我的NunitNuGet包。我认为在我的启动类或其他地方asp.net核心中测试有一些缺失的测试配置,或者一些缺失的NuGet包:/Thx提前给每个人。 这是我的测试课: 下面是我的“Gu