1

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

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 对象及其保存方法,我想知道应该对传递给保存方法的用户对象进行多深的测试。我是否应该断言该对象的每个属性都符合我的预期?还是我应该只断言 PasswordQuestion 和 PasswordAnswer 属性具有正确的值?前者对我来说似乎是正确的,因为我应该确保修改了这两个属性,而其他属性没有被触及。

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

4

2 回答 2

1

警告:前方个人意见

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

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

但是,如果/当我提交了一个影响这部分代码的错误时,我会添加任何(最初失败的)测试来覆盖错误、修复错误并离开测试。

于 2009-04-22T22:58:16.953 回答
0

既然在这里设置约束非常容易,为什么不对其进行测试以确保您的方法没有副作用?

stubbedUserDao.AssertWasCalled(x => x.Save(null), o => {
        o.IgnoreArguments();
        o.Constraints(Property.AllPropertiesMatch(expectedMatchingUser));
    });
于 2009-05-22T11:23:01.140 回答