2014-05-14 32 views
2

這篇文章要求基類方法是虛擬的:question link驗證基類中的非虛方法是使用Moq調用的

這對我不起作用,因爲基類方法不是虛擬的(我沒有編寫它,也沒有源代碼)。

如何模擬並驗證基類方法是否被調用,如果它們不是虛擬的?

最後的標準 - 我正在Mac上開發使用Xamarin Studio。 Moq的工作正常,但其他框架,如TypeMock或JustMock(Windows安裝程序)將無法正常工作。

+0

Duplicate http://stackoverflow.com/questions/11738102/how-to-mock-non-virtual-methods –

+0

@StuartLC刪除。錯誤的粘貼。 – Rwiti

+0

@JuanLopes感謝您的鏈接,但由於我在Mac上使用Xamarin Studio,我不相信這些產品會起作用。 – IUnknown

回答

3

這是不可能的。由於Moq的工作方式,Moq不會嘲笑非虛擬方法。

你嘲笑類類型YourClass直接,其中YourClassBaseClass派生,並BaseClass有這個(public?)無虛非靜態你感興趣的方法?所以你的模擬有Mock<YourClass>,而不是Mock<IYourClass>其中IYourClass是一個接口?

您是否嚴格需要使用BaseClass作爲基類,而不是「構成」(類型爲BaseClass的字段屬於您的類)?

1

如上所述,Moq只能模擬虛擬方法。
一個可能的最終運行是將您的un-moqable類包裝在代理中,並在代碼中使用此代理。

public class MyUnMoqableClass { 
    public string GetValue() { 
     return "Hello World"; 
    } 
} 

public interface IMyUnMoqableClassProxy { 
    string GetValue(); 
} 

public class UnMoqableClassProxy : IMyUnMoqableClassProxy { 

    private readonly MyUnMoqableClass _myUnMoqableClass; 

    public UnMoqableClassProxy(MyUnMoqableClass myUnMoqableClass) { 
     _myUnMoqableClass = myUnMoqableClass; 
    } 

    public string GetValue() { 
     return _myUnMoqableClass.GetValue(); 
    } 

} 

,如果你對unmoqable類大接口,但沒有讓一個隔離的客戶端代碼它可以是一個有點(很多)乏味。

+0

是的,這是我最終做的 - 我必須隔離moq無法解鎖的類。謝謝。 – IUnknown