簡體   English   中英

相同的Moq SetupSequence用於不同的對象

[英]The same Moq SetupSequence is being used for different objects

編輯:解決了

代碼實際上很好。 實際上,實際評估的方法不止一次被調用。 但是后來Rhino Repeat.Once()沒有表現出正確的行為......

我正在從RhinoMocks遷移到Moq,我無法使用mock.SetupSequence(...).Returns(...).Throws(...)使Moq正常工作mock.SetupSequence(...).Returns(...).Throws(...)

我使用nUnit的TestCaseSource進行了一些測試。

在RhinoMocks中,有一些代碼使用了Stub調用,使用了Repeat.Once() 這工作得很好。 但現在我遷移到Moq並執行SetupSequence寫的SetupSequence 每次在SetUp方法中創建一個新對象時,我都會一直得到異常。

TestCaseSource:

public static IEnumerable<TestCaseData> SettingsTestCases
{
    get
    {
        // Null Settings
        yield return new TestCaseData(null);

        // Null Acquisition
        yield return new TestCaseData(new Settings(null, new Optics()));

        // Null Optics
        yield return new TestCaseData(new Settings(new Acquisition(), null));
    }
}

SetUp:

private Mock<ISample> foo;

[SetUp]
public void SetUp()
{
    foo = new Mock<IFoo>();
}

考試:

[Test, TestCaseSource(nameof(SettingsTestCases))]
public void PerformTest(Settings settings)
{
    //THESE RHINO MOCKS LINES WORKS
    //foo.Stub(x => x.GetSettings(ExperimentId.)).Return(settings);
    //foo.Expect(x => x.Carrier).Return("Type1").Repeat.Once();

    //IN MOQ, ALWAYS GET THE EXCEPTION
    foo.Setup(x => x.GetSettings(Experiment.Id)).Returns(settings);
    foo.SetupSequence(x => x.Carrier)
        .Returns("Type1")
        .Throws(new Exception("Called too many times"));
    { do asserts here }
}

我注意到在每次測試運行之前(3次,因為TestCaseSource),它總是命中SetUp並創建一個新的Mock<IFoo>實例。 因此,對於每個測試,我們每次都有一個新的foo ,但最后看起來SetupSequence調用在3個實例之間共享,因為我有異常, 但我確信每次測試只調用一次。 犀牛模擬Repeat.Once()工作正常,似乎只涉及一個特定的實例。

我可以用不同的方式編寫代碼,以實現舊代碼(Rhino Mocks)給出的相同響應嗎?

我發現了錯誤。 實際上在斷言部分期間有人對GetSettings方法進行了其他調用,因此如果只預期一次調用,這顯然會拋出錯誤。 (所以我確定錯了。對我感到羞恥!)

背后的邏輯是:第一個調用應該返回“Type1”,其余的應該返回其他東西。

這提出了另一個問題:Rhino Repeat.Once()失敗了,然后呢? 即使有多個電話,它也會通過。

暫無
暫無

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

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