12

GetValueMoqを使用して、次のクラスのメソッドのみをモックしたい:

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;
    }
}

これがMoqでどのように機能するかについては、すでに少し読んでいます。オンラインで見つけた解決策は、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();
 }

Moq は既存の実装を使用し、MyMethodモックされたメソッドを呼び出すと予想されます。その結果、次の出力が得られます。

ORIGINAL MyMethod: 999
MOCKED GetValue

しかし、それは私が得るものです:

ORIGINAL GetValue
ORIGINAL MyMethod: 10

その後

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

何かを完全に誤解しているような気がしました。ここで何が欠けていますか?どんな助けでもいただければ幸いです

4

2 に答える 2

8

OK、別の質問でこれに対する答えを見つけました:クラスの内部メソッドをモックする方法は? . したがって、これは重複しており、閉じることができます。

Assembly.configそれにもかかわらず、ここに解決策があります: テストしたいプロジェクトの に次の行を追加するだけです:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq
于 2012-06-13T16:11:06.580 に答える
0

Verifiable を指定しようとしましたか:

my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable();
于 2012-06-13T15:17:58.213 に答える