2008-09-10 68 views
1

假設我有一個我正在嘲笑的IFoo接口。這個接口有三種方法。我需要測試被測系統至少調用三種方法之一。我不在乎多少次,也不在乎它所謂的參數,但忽略所有方法但不觸及IFoo模擬的情況就是失敗的情況。Rhino Mocks - 如何測試至少有一組方法被調用?

我一直在瀏覽Expect.Call文檔,但看不到一個簡單的方法來做到這一點。

任何想法?

回答

1

當一個函數被調用時,你可以給Rhino mocks一個lambda運行。這個lambda可以增加一個計數器。斷言計數器> 1,你就完成了。

評論人:Don Kirkby: 我相信Mendelt指的是Do方法。

+0

我相信Mendelt指的是Do方法。 – 2008-09-30 19:59:42

+0

感謝您對我的回答太短的有用評論。將其添加到問題中。 – Mendelt 2008-09-30 20:19:54

0

不知道這是否回答你的問題,但我發現如果我需要用Rhino(或任何類似的框架/庫)來做任何事情,任何我不知道如何做的事情,最好只是創建一個手動模擬。

如果調用任何方法,創建一個實現接口並將公共布爾型字段設置爲true的類將變得非常簡單,您可以爲該類指定一個描述性名稱,這意味着(最重要的)下一個查看的人代碼將立即理解它。

0

如果我正確理解了你的話,你想檢查一下接口在三種指定方法中至少有一次被調用。通過the quick reference看我不認爲你可以在Rhino Mocks中做到這一點。

直覺上我認爲你想寫一個脆弱的測試,這是一個壞的東西。這意味着不完整的被測試類的規格。我強烈建議你考慮這個設計,以便被測試的類和測試可以有一個已知的行爲。

然而,要用一個例子來說,你可以這樣做(,但不要)。

[TestFixture] 
public class MyTest { 

    // The mocked interface 
    public class MockedInterface implements MyInterface { 
     int counter = 0; 
     public method1() { counter++; } 
     public method2() { counter++; } 
     public method3() { counter++; } 
    } 

    // The actual test, I assume you have the ClassUnderTest 
    // inject the interface through the constructor and 
    // the methodToTest calls either of the three methods on 
    // the interface. 
    [TestMethod] 
    public void testCallingAnyOfTheThreeMethods() { 
     MockedInterface mockery = new MockedInterface(); 
     ClassUnderTest classToTest = new ClassUnderTest(mockery); 

     classToTest.methodToTest(); 

     Assert.That(mockery.counter, Is.GreaterThan(1)); 
    } 
} 

(有人檢查我的代碼,我已經從我的腦袋現在寫的這一點,並沒有寫C#的東西,現在大約一年)

我很想知道你爲什麼'雖然這樣做。

相關問題