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中只要你設定預期的函式沒有被呼叫, 算是失敗.

arrow
arrow
    全站熱搜

    kojenchieh 發表在 痞客邦 留言(0) 人氣()