2009-04-22 29 views
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属性具有正确的值?前者似乎对我来说,因为我应该确保只有这两个属性已被修改,其他未被触及。

我希望有人可以对此发表自己的看法。对于这些类型的情况,有没有经验法则或模式?

回答

1

警告:未来的个人意见

好了,现在这出的方式....对我来说,它归结为是我需要做的,觉得我的代码正确地实现所需的逻辑。在这种情况下?我有两个测试用例:

  • 用的ValidateUser返回false
    • 应该返回false
    • 保存不应该被称为
  • 用的ValidateUser处理返回true处理
    • 应该返回true
    • 保存应该被称为
      • 对象传递给保存有修改的问题和用户对象上回答
      • 其他属性没有检查

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

0

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

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