2012-06-13 72 views
10

我想嘲笑只有以下類的GetValue方法,使用起訂量:類的部分嘲諷與起訂量

public class MyClass 
{ 
    public virtual void MyMethod() 
    { 
     int value = GetValue(); 
     Console.WriteLine("ORIGINAL MyMethod: " + value); 
    } 

    internal virtual int GetValue() 
    { 
     Console.WriteLine("ORIGINAL GetValue"); 
     return 10; 
    } 
} 

我已經讀了一下這個應該怎麼用起訂量工作。我在網上找到的解決方案是使用CallBase屬性,但這對我不起作用。

這是我的測試:

[Test] 
public void TestMyClass() 
{ 
    var my = new Mock<MyClass> { CallBase = true }; 
    my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999); 
    my.Object.MyMethod(); 
    my.VerifyAll(); 
} 

我預料起訂量使用現有實現的MyMethod並調用模擬的方法,從而產生以下的輸出:

ORIGINAL MyMethod: 999 
MOCKED GetValue 

但是這就是我得到:

ORIGINAL GetValue 
ORIGINAL MyMethod: 10 

然後

Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue() 

我覺得,我完全誤解了一些東西。我在這裏錯過了什麼? 任何幫助,將不勝感激

+0

可能重複方法?](http://stackoverflow.com/questions/2822947/when-mocking-a-class-with-moq-how-can-i-callbase-for-just-specific-methods) – StriplingWarrior

+0

如果你讓你的' GetValue'方法'public'而不是'internal'它的工作原理。我不知道爲什麼這可能是Castle動態代理的限制,或者它是Moq的錯誤,或者這是預期的行爲。無論如何,如果將其作爲內部使用,除非使用InternalVisibleTo,否則不能將生產代碼放到不同的部件中。 – nemesv

+0

[驗證方法被稱爲]的可能重複(http://stackoverflow.com/questions/1980108/verifying-a-method-was-called) – nemesv

回答

5

OK,我找到了答案,這在另外一個問題:How to Mock the Internal Method of a class?。所以這是重複的,可以關閉。

然而,這裏的解決方案: 只是這一行,你要測試添加到項目的Assembly.config

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq 
的[當嘲諷與起訂量一類,我怎麼能CallBase只是特定
+0

要測試的Assembly.config?或者到正在測試的類的Assembly.config? – Nick

+0

正在測試的類!我編輯了我的答案並澄清了一點。 – Fabian

0

你有沒有嘗試指定可驗證:

my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable(); 
+0

沒有嘗試過,但它沒有區別 – Fabian