Repeat.Any()似乎覆盖了Repeat.Once()

本文关键字:Repeat Once 覆盖 Any | 更新日期: 2023-09-27 18:15:33

我使用Rhino Mocks 3.6,我设置了一个模拟,我想要一个方法第一次返回true,然后每次返回false。我是通过指定.Return(true).Repeat.Once().Return(false).Repeat.Any()来实现的。但这似乎使它一直返回false。相反,我不得不将第二个改为.Return(false).Repeat.AtLeastOnce()。我想知道为什么Any()会有这样的行为。下面是一些示例代码。第一次测试将失败,而第二次测试将成功。

[TestClass]
public class ExampleTest
{
    private Example example;
    private IFoo foo;
    [TestInitialize]
    public void InitializeTest()
    {
        example = new Example();
        foo = MockRepository.GenerateStrictMock<IFoo>();
    }
    [TestMethod]
    public void Test1()
    {
        foo.Expect(f => f.SomeCondition()).Return(true).Repeat.Once();
        foo.Expect(f => f.SomeCondition()).Return(false).Repeat.Any();
        foo.Expect(f => f.SomeMethod()).Repeat.Once();
        example.Bar(foo);
        foo.VerifyAllExpectations();
    }
    [TestMethod]
    public void Test2()
    {
        foo.Expect(f => f.SomeCondition()).Return(true).Repeat.Once();
        foo.Expect(f => f.SomeCondition()).Return(false).Repeat.AtLeastOnce();
        foo.Expect(f => f.SomeMethod()).Repeat.Once();
        example.Bar(foo);
        foo.VerifyAllExpectations();
    }
}
public interface IFoo
{
    bool SomeCondition();
    void SomeMethod();
}
public class Example
{
    public void Bar(IFoo foo)
    {
        if (foo.SomeCondition())
        {
            if (!foo.SomeCondition())
            {
                foo.SomeMethod();
            }
        }
    }
}

Repeat.Any()似乎覆盖了Repeat.Once()

Any方法的文档如下(THEIR拼写和语法):

Repeat the method any number of times. This has special affects in that this method would now ignore orderring

所以,简而言之,Any被设计成忽略排序 这就提出了一个问题:如何将第一个期望设置为返回一个结果,然后在之后调用任何以返回不同的结果?似乎你能做的最好的是使用Times与最小和最大参数:
[TestMethod]
public void Test2()
{
    foo.Expect(f => f.SomeCondition()).Return(true).Repeat.Once();
    foo.Expect(f => f.SomeCondition()).Return(false).Repeat.Times(0, int.MaxValue);
    foo.Expect(f => f.SomeMethod()).Repeat.Once();
    example.Bar(foo);
    example.Bar(foo);
    example.Bar(foo);
    foo.VerifyAllExpectations();
}