相同的Moq SetupSequence用于不同的对象

时间:2019-04-19 11:45:46

标签: c# nunit moq rhino-mocks

编辑:已解决

代码实际上很好。实际上,被评估的方法实际上被多次调用。但是随后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)给出的相同响应,我可以用不同的方式编写代码吗?

1 个答案:

答案 0 :(得分:0)

我发现了错误。实际上,在断言部分中,有人对GetSettings方法进行了其他调用,因此,如果只希望进行一次调用,则显然会引发错误。 (所以我确定有什么问题。可耻!)

背后的逻辑是:第一个调用应返回“ Type1”,其余的应返回其他内容。

这又引发了一个问题:Rhino Mocks Repeat.Once()失败了吗?即使通过多个电话也通过了。