在保存时测试对象的状态

时间:2009-04-22 22:33:45

标签: asp.net unit-testing tdd mocking rhino-mocks

我正在为这样的方法编写单元测试:

public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
    ISPMembershipUserDao userDao = GetISPMembershipUserDao();

    if (ValidateUser(username, password))
    {
        SPMembershipUser user = userDao.GetUserByUserName(username);

        user.PasswordQuestion = newPasswordQuestion;
        user.PasswordAnswer = newPasswordAnswer;

        userDao.Save(user);

        return true;
    }

    return false;
}

这是一种相当简单的测试方法。我正在使用Rhino Mocks框架。但有一个方面让我质疑自己。我存根DAO对象及其保存方法,我想知道我应该多深入地测试传递给save方法的用户对象。我应该断言该对象的每个属性是否符合我的预期?或者我应该断言PasswordQuestion和PasswordAnswer属性是否具有正确的值?前者对我来说似乎是正确的,因为我应该确保这两个属性已被修改,而其他属性未被触及。

我希望有些人可以就此发表意见。对于这些类型的情况,是否需要记住一个经验法则或模式?

2 个答案:

答案 0 :(得分:1)

警告:提前个人意见

好的,现在已经不在了......对我来说,这取决于我需要做些什么来感觉我的代码正确地实现了所需的逻辑。在这种情况下?我有两个测试用例:

  • 处理ValidateUser返回false
    • 应该返回false
    • 不应该保存保存
  • 处理ValidateUser返回true
    • 应该返回true
    • 应该已经调用了保存
      • 传递给保存的对象具有修改后的问题和答案
      • 不检查用户对象上的其他属性

然而,如果/当我收到影响这部分代码的错误时,我会添加任何(最初失败的)测试以覆盖错误,修复错误并离开测试。

答案 1 :(得分:0)

由于在这里设置约束非常容易,为什么不测试它以确保您的方法没有副作用?

stubbedUserDao.AssertWasCalled(x => x.Save(null), o => {
        o.IgnoreArguments();
        o.Constraints(Property.AllPropertiesMatch(expectedMatchingUser));
    });