簡體   English   中英

我可以復制Moq Mock實現嗎?

[英]Can I copy a Moq Mock implementation?

我一直在使用Moq並喜歡它,但我遇到了一個模擬一些遺留代碼的問題(在我嘗試重構之前)

我真正想要做的是有兩個單獨的模擬,只有略有不同的實現,如下面的示例。

        Mock<IFoo> fooMock = new Mock<IFoo>();
        fooMock.SetupGet(f => f.bar).Returns(7);
        fooMock.SetupGet(f => f.bar2).Returns(3);
        Mock<IFoo> fooMockClone = new Mock<IFoo>(fooMock.Behavior);
        fooMockClone.SetupGet(f => f.bar).Returns(9);

        Debug.Assert(7 == fooMock.Object.bar);
        Debug.Assert(9 == fooMockClone.Object.bar);
        Debug.Assert(3 == fooMockClone.Object.bar2);
        Debug.Assert(3 == fooMock.Object.bar2);

這是一個簡單的例子,但真正的代碼是一個有很多方法的對象,我想要兩個版本略有不同的實現。

謝謝

我想知道在這種情況下,如果你正在尋找行為測試。 這是使用Moq子層的Machine.Fakes中的示例...它允許嵌套看起來像你想要的,同時仍然保持測試的邏輯分離。 需要NuGet包:Machine.Fakes.Moq,Machine.Specifications.Should

class IFoo_test_context : WithSubject<IFoo>
{
    Establish context = () => Subject.bar2 = 3;
}

class When_fooing_with_seven : IFoo_test_context
{
    Establish context = () => Subject.bar = 7;

    It bar_should_be_seven =()=> Subject.bar.ShouldEqual(7);
    It bar2_should_be_three =()=> Subject.bar.ShouldEqual(3);
}

class When_fooing_with_nine : IFoo_test_context
{
    Establish context = () => Subject.bar = 9;

    It bar_should_be_nine = () => Subject.bar.ShouldEqual(9);
    It bar2_should_be_three = () => Subject.bar.ShouldEqual(3);
}

再一次,這個例子有些愚蠢,因為它正在測試模擬行為,但很難看出你最終想要完成什么。 據我所知,Mock沒有你想要的復制構造函數。

您不模擬實現細節,您可以模擬值,以便您可以在代碼中找到需要測試的點。 編寫一個測試模擬依賴項輸出值的測試沒有意義,那么你只是測試moq。

例如:

public class Stuff {
    IFoo _foo;
    IBar _bar;
    public Stuff(IFoo foo, IBar bar){
        _foo = foo;
        _bar = bar;
    }
    public void DoStuff() {
        if(_foo.HasFooage) {
            _bar.Bar = 4;
        }
    }
}

然后你的測試會:

...
public void test_bar_does_bar() {
    var foo = new Mock<IFoo>();
    foo.Setup(f => f.HasFooage).Returns(true);
    var bar = new Mock<IBar>();
    var stuff = new Stuff(foo.Object, bar.Object);

    stuff.DoStuff();

    Assert.That(bar.Bar, Is.EqualTo(4));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM