6

私はこの数時間、このMoq体操を理解しようとしています。私は次のクラスを持っています-そして私はやや簡単な検証をしようとしていますが失敗しています-そして私はその理由を理解できないようです。

Moqのセットアップ中に、BeginCounterが要求されたときにMock.Ofを返しますが、それを確認しようとすると失敗します。ただし、行p.Setup(e => e.BeginCounter.Increment())のコメントを外すと、検証は機能します。

私は何が欠けていますか?

public interface IPerformanceCounters
{
    void Increment();
    void Decrement();
}

public interface IContext
{
    IPerformanceCounters BeginCounter { get; }
}

public class Test
{
    private readonly IContext context;
    public Test(IContext context) { this.context = context; }
    public void React() { this.context.BeginCounter.Increment(); }
}

void Test()
{
    // ARRANGE
    var p = new Mock<IContext>();
    p.Setup(e => e.BeginCounter).Returns(() => Mock.Of<IPerformanceCounters>());  // This does not work
    // p.Setup(e => e.BeginCounter.Increment()); // However, this works!

    // ACT
    var test = new Test(p.Object);
    test.React();

    // ASSERT
    p.Verify(v => v.BeginCounter.Increment(), Times.Once());
}
4

1 に答える 1

3

これは、セットアップ以外の方法が検証できないためだと思います。

私の知る限り、あなたはモックを返送し、それに対して検証しようとしています。ただし、セットアップのコメントを解除するまで準備はできません。

void Test()
{
    // ARRANGE
    var p = new Mock<IContext>();
    var perfCountMock = new Mock<IPerformanceCounters>();
    p.Setup(e => e.BeginCounter).Returns(() => perfCountMock.Object);  // This does not work
    perfCountMock.Setup(e => e.Increment());

    // ACT
    var test = new Test(p.Object);
    test.React();

    // ASSERT
    perfCountMock.Verify(v => v.Increment(), Times.Once());
}

上記はあなたが実際に行っていることです。IContext通話を確認するのではなく、通話を確認しIPerformanceCountersます。わかりやすくするためにこのように設定しますが、同じように簡単にコメントを外すことができます

そのままにしておきたい場合は、Mock.Of機能をよく理解する必要があります。

void Test()
{
        // ARRANGE
        var p = new Mock<IContext>();
        var mockOfPerf = Mock.Of<IPerformanceCounters>();
        p.Setup(e => e.BeginCounter).Returns(mockOfPerf);  // This does not work

        // ACT
        var test = new Test1(p.Object);
        test.React();

                    // ASSERT
        Mock.Get(mockOfPerf).Verify(v=>v.Increment(), Times.Once());
}

これは上記と同じですが、の目的の機能を使用するだけですMock.Of。ネストされたモックを検証することはできません。実際のモックに対して検証する必要があります

于 2012-11-20T03:21:49.737 に答える