2009-04-22 72 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)); 
    });