2012-11-20 121 views
5

我試圖找出過去幾個小時這Moq體操。我有以下課程 - 我正在嘗試做一些簡單的驗證,但它沒有成功 - 我似乎無法弄清楚爲什麼。嵌套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()); 
} 

回答

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的預期功能。你不能驗證嵌套的模擬,你需要驗證實際的模擬

+0

我不認爲這種說法「非設置方法不可驗證」是真實的。這是爲什麼。如果我在IContext中添加方法,我可以在沒有設置的情況下驗證它。這是IContext> IPerformanceCounters的嵌套性質,這引起了一個我似乎無法忍受的問題。 – splusq

+1

我剛更新了我的答案。希望這樣做更有意義。最壞的情況下,你可以挖掘代碼,因爲它是開源的 –

+0

謝謝 - Mock.Get是一個不錯的小竅門。 – splusq