我有什么我希望是一个非常简单的情况下很难找到信息。我试图单元测试我的ASP.NET MVC 2控制器,它利用自定义输入模型W / DataAnnotions的行动。我的测试框架的xUnit,在标题中提到的。

下面是我的自定义的输入模型

public class EnterPasswordInputModel
{
    [Required(ErrorMessage = "")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Password is a required field.")]
    public string Password { get; set; }
}

这是我的控制器(拿出一些逻辑来简化此例):

[HttpPost]
public ActionResult EnterPassword(EnterPasswordInputModel enterPasswordInput)
{
    if (!ModelState.IsValid)
        return View();

    // do some logic to validate input
    // if valid - next View on successful validation
        return View("NextViewName");
    // else - add and display error on current view
        return View();
}

和这里是我的的xUnit情况(也被简化):

[Fact]
public void EnterPassword_WithValidInput_ReturnsNextView()
{
    // Arrange
    var controller = CreateLoginController(userService.Object);

    // Act
    var result = controller.EnterPassword(
        new EnterPasswordInputModel
            {
                Username = username, Password = password
            }) as ViewResult;

    // Assert
    Assert.Equal("NextViewName", result.ViewName);
}

当我跑我的测试,我得到以下错误在我的测试其实试图检索控制器结果时(法部分):

System.NullReferenceException: Object reference not set to an instance of an object.

在此先感谢您的帮助,您可以提供!

有帮助吗?

解决方案

我觉得我的轨道,虽然一个解决方案上。这里是我对控制器进行更改:

<强>原始

if (!ModelState.IsValid)
    return View();

<强>更新

if (!TryUpdateModel(loginInput))
            return View();

看来,模型结合我的测试过程中没有发生。看来,除非一个POST发生模型绑定不会发生。通过迫使试图模型结合我能得到测试通过。

注意:还有我的行动的错误是造成我原来的空引用我造成的,而试图找出为什么我的模型没有被验证

参考: 的http:// bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

其他提示

您要您的控制器动作中提领一空实例。也许你拿出来的代号为“简化”的问题。看看在测试结果中找出调用堆栈。您可能需要模拟的东西进行试验。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top