C# 如何使用Times()方法为Rhinomock中的方法调用设置最大值/上限?

C# 如何使用Times()方法为Rhinomock中的方法调用设置最大值/上限?,c#,rhino-mocks,C#,Rhino Mocks,我试图测试一个方法是否被调用了3到4次: using Microsoft.VisualStudio.TestTools.UnitTesting; using Rhino.Mocks; using StructureMap.AutoMocking; namespace AutoMockPlayground { [TestClass] public class SomeTests { [TestMethod] public void Bara

我试图测试一个方法是否被调用了3到4次:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rhino.Mocks;
using StructureMap.AutoMocking;

namespace AutoMockPlayground
{
    [TestClass]
    public class SomeTests
    {
        [TestMethod]
        public void Bara_ShouldBeCalledThreeOrFourTimes()
        {
            var autoMocker = new RhinoAutoMocker<Foo>(MockMode.AAA);

            var barMock = autoMocker.Get<IBar>();

            // Bara() should not be called more than four times
            barMock.Stub(bar => bar.Bara()).Repeat.Times(3, 4);

            autoMocker.ClassUnderTest.DoSomeThing();

            barMock.VerifyAllExpectations();
        }
    }

    public interface IBar
    {
        void Bara();
    }

    public class Foo
    {
        private readonly IBar _bar;

        public Foo(IBar bar)
        {
            _bar = bar;
        }

        public void DoSomeThing()
        {
            _bar.Bara();
            _bar.Bara();
            _bar.Bara();
            _bar.Bara();
            _bar.Bara();
        }
    }
}
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用犀牛;
使用StructureMap.AutoMocking;
命名空间自动模拟
{
[测试类]
公共类考试
{
[测试方法]
公共真空巴拉(Bara_)应该被称为三次或四次()
{
var autoMocker=新的RhinoAutoMocker(MockMode.AAA);
var barMock=autoMocker.Get();
//调用Bara()的次数不应超过四次
Stub(bar=>bar.Bara()).Repeat.Times(3,4);
autoMocker.ClassUnderTest.DoSomeThing();
barMock.verifyallexpections();
}
}
公共接口IBar
{
void Bara();
}
公开课Foo
{
专用只读IBar\u条;
公共食品(IBar酒吧)
{
_巴=巴;
}
公共无效剂量测定法()
{
_bar.Bara();
_bar.Bara();
_bar.Bara();
_bar.Bara();
_bar.Bara();
}
}
}
我使用的是
Repeat.Times(intmin,intmax)
,但是
max
参数似乎没有任何效果。 尽管调用了5次
Bara()
,但该测试还是通过了


我如何在测试中表示
Bara()
应该被调用3到4次?

我不熟悉
RhinoAutoMocker
,但它看起来像是被用作存根对象而不是模拟对象

如果它是存根(即使用.stub()),则调用
verifyallexpections()
将无效。相反,它需要是一个模拟对象,调用
verifyallexpections()
应该可以工作

例如,下面是我如何在测试中使用模拟

var mockObject = MockRepository.GenerateMock<IFoo>();

mockObject.Expect(o => o.CallSomething().Repeat.Times(1);

mockObject.VerifyAllExpecttions();
var mockObject=MockRepository.GenerateMock();
Expect(o=>o.CallSomething().Repeat.Times(1);
mockObject.verifyAllExpections();
所以不是

barMock.Stub(bar=>bar.Bara())。重复.Times(3,4);

你能做什么

barMock.Expect(bar=>bar.Bara()).Repeat.Times(3,4);

编辑:

只是为了扩展:

存根

存根是一个您不打算对其进行任何断言的对象。您可以使用存根插入方法返回值的默认值,或存根掉对
void
方法的调用

在存根对象上调用
.verfiyxxx
不会产生任何效果,因为根据定义,存根不会跟踪该对象是如何与之交互的,它只知道“当调用方法x()时,请执行此其他操作”

Mock


如果您希望断言与对象的交互,例如方法被调用了4次,或者方法被调用了一组特定的参数,那么您需要一个模拟对象。使用模拟需要调用
Expect
(这取决于您使用的模拟框架,但通常是
Expect

根据定义,存根不会检查期望值,另请参见。
但是,只需调用
AssertWasCalled

您可以按如下方式修改代码:

    var autoMocker = new RhinoAutoMocker<Foo>(MockMode.AAA);

    var barMock = autoMocker.Get<IBar>();

    autoMocker.ClassUnderTest.DoSomeThing();

    // Bara() should not be called more than four times
    barMock.AssertWasCalled(bar => bar.Bara(),     
                            options => options.IgnoreArguments().Repeat.Times(3,4));
var autoMocker=new-RhinoAutoMocker(MockMode.AAA);
var barMock=autoMocker.Get();
autoMocker.ClassUnderTest.DoSomeThing();
//调用Bara()的次数不应超过四次
调用了barMock.assertwas(bar=>bar.Bara(),
options=>options.IgnoreArguments().Repeat.Times(3,4));

可能,我应该使用
Expect()
而不是
Stub()
,但是即使使用
Stub()
测试失败,如果
Bara()
只调用了两次。而且它与
Expect()
也不起作用,测试仍然通过。如果
Bara(),测试失败
只被调用了两次,因此,您关于存根未检查期望值的陈述是不正确的。(可能是因为使用了一个
RhinoAutoMocker
,它可能调用
generatemock()
)AssertWasCalled()语法按照我的预期工作。