你在控制器中测试的是什么?

时间:2012-08-01 09:23:43

标签: asp.net asp.net-mvc unit-testing

假设您的控制器中有注册操作。

    [HttpPost]
    public ViewResult Register(string username, string email, string password, string repeatPassword)

此操作将:

  1. 检查并验证参数
  2. 传达并添加新数据 存储库
  3. 返回视图。
  4. 绝对需要单元测试1和3,但2怎么样? 有没有办法单元测试2而不必在存储库中实现add方法?

    谢谢,

    RWendi

2 个答案:

答案 0 :(得分:2)

使用Moq进行的#2测试将是:

[Test]
public void UserIsAddedToRepository()
{
    // arrange
    var username = "user1";
    var email = "email@address";
    var password = "password";
    var controller = new LoginController();
    var mockUserRepo = new Mock<IUserRepo>();
    mockUserRepo.Setup(m => m.AddNewUser(username, email, password));

    // act
    controller.Register(username, email, password, "");

    // assert
    mockUserRepo.Verify(m => m.AddNewUser(username, email, password));
}

Moq的验证的行为类似于NUnit Assert ,如果未调用预期的方法,将无法通过测试。

答案 1 :(得分:1)

为了测试2号,您可以使用模拟。您可以模拟存储库并返回测试的有效结果。

您可以手动执行模拟(以多种方式,例如将参数传递给具有相关存储库的操作方法 - 实际或模拟;或使用相关模拟对象实例化控制器类等)或者您可以使用像Moq这样的模拟库。