Mock object framework (2)
Source: The art of unit testing with examples in .NET, Roy Osherove
http://www.amazon.com/Art-Unit-Testing-Examples-Net/dp/1933988274/ref=sr_1_1?ie=UTF8&s=books&qid=1267086529&sr=1-1
Chapter 5 Isolation (mock object) framework
1. strict mock object
- 預期要呼叫的method和處理的參數要一模一樣, 否則測試就算失敗
- 如果不相同時, Rhino Mock會丟出exception
在之前的測試程式, 我們用下面這個片段, 設定預期呼叫的方式是什麼
using(mocks.Record()) {
simulatedServoce.LogError("Filename too short: abc.ext");
}
因此,之後若是沒有呼叫到LogError, 或是傳進LogError的參數不是"Filename too short: abc.ext", 或者呼叫了LogError以外的函式, 都算是錯誤.
2. nonstrict mock object
可是我想有些狀況下, 你會需要有更大的彈性, 所以Rhino Mock提供了另一種選擇: non-strict mock object. 讓我們來看看一個範例:
[Test]
public void Analyze_TooShortFileName() {
// create dynamic mock object
MockRepository mocks = new MockRepository();
IWebService simulatedServoce = mocks.DynamicMock
using(mocks.Record()) {
simulatedServoce.LogError("Filename too short: abc.ext");
}
// invokes LogAnalyzer
LogAnalyzer log = new LogAnalyzer( simulatedServoce);
string tooShortFileName = "abc.ext";
log.Analyze(tooShortFileName);
mocks.VerifyAll(simulatedServoce);
}
在受測程式中, 你可以呼叫LogError之外的函式.
此外你若是呼叫了一個函式, 它會有傳回值, 可是你忘記去設定它, Rhino Mock會根據傳回值的type去傳回一些預設值(0 or null). 其它framework可能會有不同的作法
在non-strick mock object中只要你設定預期的函式沒有被呼叫, 算是失敗.
留言列表