[英]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.