代码实际上很好。实际上,被评估的方法实际上被多次调用。但是随后Rhino Mocks Repeat.Once()
没有表现出适当的行为...
我正在从RhinoMocks迁移到Moq,但无法使用mock.SetupSequence(...).Returns(...).Throws(...)
使Moq正常工作。
我使用nUnit的TestCaseSource
进行了一些测试。
在RhinoMocks中,有些代码使用Stub
来调用Repeat.Once()
。很好。但是现在我迁移到了Moq,并完成了上面写的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));
}
}
设置:
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, ALLWAYS 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 }
}
我已经注意到,在每次运行测试之前(由于TestCaseSource的原因,测试进行了3次),它总是命中SetUp
并创建Mock<IFoo>
的新实例。因此,对于每个测试,每次都有一个新的foo
,但最后似乎SetupSequence
调用在3个实例之间共享,因为我有一个例外,确保每次测试仅调用一次。 Rhino Mocks Repeat.Once()
运作良好,似乎仅针对一个特定实例。
为了实现旧代码(Rhino Mocks)给出的相同响应,我可以用不同的方式编写代码吗?
答案 0 :(得分:0)
我发现了错误。实际上,在断言部分中,有人对GetSettings
方法进行了其他调用,因此,如果只希望进行一次调用,则显然会引发错误。
(所以我确定有什么问题。可耻!)
背后的逻辑是:第一个调用应返回“ Type1”,其余的应返回其他内容。
这又引发了一个问题:Rhino Mocks Repeat.Once()
失败了吗?即使通过多个电话也通过了。