单元测试(xUnit)带有自定义输入模型的ASP.NET Mvc控制器?

时间:2010-05-14 13:14:10

标签: asp.net-mvc asp.net-mvc-2 xunit.net model-validation

我很难找到有关我期望的非常简单的方案的信息。我正在尝试对我的ASP.NET Mvc 2控制器上的一个Action进行单元测试,该控制器使用带有DataAnnotions的自定义输入模型。我的测试框架是xUnit,如标题中所述。

这是我的自定义输入模型

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

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

这是我的控制器(为这个ex取出了一些简化的逻辑):

[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 (也简化):

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

当我运行测试时,在尝试检索控制器结果时,我的测试事实会出现以下错误(Act部分):

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

提前感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:1)

我认为我正在寻找解决方案。以下是我对控制器所做的更改:

<强>原始

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

答案 1 :(得分:0)

您在控制器操作中取消引用了一个null实例。可能在你用来“简化”问题的代码中。查看测试结果中的调用堆栈以找出答案。您可能需要模拟测试内容。