2010-10-07 91 views
0

我有一個從抽象基類繼承的類。我試圖驗證在基類中指定的受保護的方法被調用兩次,我想驗證傳遞的參數是特定的值(每次調用不同)。驗證受保護的方法是用Moq 3.1調用的

我希望我能夠使用ProtectedExpectVerify,但似乎我已經錯過了用這些方法可以完成的工作。

是我試圖與moq?

UPDATE: 的什麼,我試圖做一個例子:

class MyBase 
{ 
    protected void SomeMethodThatsAPainForUnitTesting(string var1, string var2) 
    { 
     //Stuf with file systems etc that's very hard to unit test 
    } 
} 

class ClassIWantToTest : MyBase 
{ 
    public void IWantToTestThisMethod() 
    { 
     var var1 = //some logic to build var 1 
     var var2 = //some logic to build var 2 
     SomeMethodThatsAPainForUnitTesting(var1, var); 
    } 
} 

基本上我要測試的變量VAR1和VAR2正確地創建並傳遞到SomeMethodThatsAPainForUnitTesting的方式,所以基本上我想嘲笑受保護的方法,驗證它至少被調用過一次,並且參數全部正確傳遞。如果這是在一個接口上調用一個方法,這將是微不足道的,但是我正在用一種受保護的方法來解決問題。

我不能輕易改變設計,因爲它是棕色領域的發展,而且我不是唯一調用該方法的類。

+0

謝謝澄清。我刪除了我的答案,因爲它沒有解決問題。 – 2010-10-08 13:47:30

回答

1

不,這是不可能的。

像Moq和Rhino mocks這樣的工具通過生成你想在運行時模擬的類型的子類來發揮他們的魔力。他們通過覆蓋一個成員(在虛擬成員的情況下)或實現它(在一個接口的情況下)並且插入代碼來檢查或記錄傳遞的參數並返回預定義的邏輯來產生他們所有的「驗證」和「期望」罐裝反應。

那麼你能做些什麼來解決這個問題?首先,如果你可以改變基本方法是虛擬的,這將然後允許你創建一個測試工具,像這樣來測試你的方法: -

class ClassIWantToTestHarness : ClassIWantToTest { 
    public string Arg1 { get; set; } 
    public string Arg2 { get; set; } 
    public int CallCount { get; set; } 

    protected override void SomeMethodThatsAPainForUnitTesting(var1, var2) { 
     Arg1 = var1; 
     Arg2 = var2; 
      CallCount++; 
    } 
} 

[Test] 
public void ClassIWantToTest_DoesWhatItsSupposedToDo() { 
    var harness = new ClassIWantToTestHarness(); 
    harness.IWantToTestThisMethod(); 
    Assert.AreEqual("Whatever", harness.Arg1); 
    Assert.AreEqual("It should be", harness.Arg2); 
    Assert.IsGreaterThan(0, harness.CallCount); 
} 

如果這是不可能改變的基類,在所有因代碼是如此可怕的棕色領域,你不想讓自己的鞋子變髒,你可以簡單地將該方法作爲受保護的虛擬方法包裝在ClassIWantToTest中,然後執行相同的技巧。 Moq確實支持覆蓋受保護的虛擬成員(請參閱雜項部分here) - 雖然我個人更喜歡手動測試用具。