最有可能是這樣的:
[Test]
public void Test()
{
// Arrange
ISth sth= MockRepository.GenerateMock<ISth>();
sth
.Stub(x => x.A())
.Return("sth");
// Act
FunctionBeingTested(sth);
// Assert
}
要真正從新AAA語法中獲益,你必須改變你的想法一點。我嘗試解釋。
我的建議存在一個主要區別:沒有「預期驗證」。所以我建議不要期待這個調用,因爲有一個返回值。我假設該方法在沒有調用sth.A
時無法通過測試,因爲它會錯過正確的返回值。它至少會失敗其中一個斷言。
這實際上是一件好事。
- 你可以將Stub移動到TestInitialize,當測試中沒有調用stubbed方法時(這不是期望值),它不會傷害。你的測試會變得更短。
- 您的測試不知道「如何」測試系統完成這項工作,您只檢查結果。您的測試將變得更加可維護。
還有另外一種情況,你確實需要檢查的方法已呼籲模擬。主要是如果它返回無效。例如:事件應該已經被解僱,交易已經完成,等等。使用AssertWasCalled
此:
[Test]
public void Test()
{
// Arrange
ISth sth= MockRepository.GenerateMock<ISth>();
// Act
FunctionBeingTested(sth);
// Assert
sth
.AssertWasCalled(x => x.A());
}
注:沒有返回值,所以沒有存根。這是一個理想的情況。當然,你可以同時擁有兩個,分別是Stub
和AssertWasCalled
。
還有Expect
和VerifyAllExpectations
,這實際上表現爲舊的語法。我只會在你使用時需要Stub
和AssertWasCalled
在相同的測試中,和你有完整的參數約束,你不想寫兩次。通常,避免Expect
和VerifyAllExpectations