【问题标题】:Testing an object's state at save在保存时测试对象的状态
【发布时间】:2009-04-22 22:33:44
【问题描述】:

我希望为这样的方法编写单元测试:

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 属性具有正确的值?前者对我来说似乎是正确的,因为我应该确保只有这两个属性已被修改,而其他属性没有被修改。

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

【问题讨论】:

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


    【解决方案1】:

    警告:个人意见提前

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

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

    但是,如果/当我收到影响这部分代码的错误时,我会添加任何(最初失败的)测试来覆盖错误、修复错误并退出测试。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 2010-12-27
        • 2010-12-04
        • 2013-03-20
        相关资源
        最近更新 更多