如何使用Times()方法设置最大/上限以在犀牛中的方法调用



我正在尝试测试一种方法在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();
        }
    }
}

我正在使用Repeat.Times(int min, int max),但是max参数似乎没有任何效果。该测试通过Bara()被称为5次。

我在测试中如何表达Bara()应在3到4次之间调用?

固定量不会检查期望,另请参阅此。
但是,您只需致电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));

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

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

例如,这是我在测试中使用模拟的方式。

var mockObject = MockRepository.GenerateMock<IFoo>();
mockObject.Expect(o => o.CallSomething().Repeat.Times(1);
mockObject.VerifyAllExpecttions();

所以而不是

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

你可以做

吗?

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

编辑:

只是为了扩展:

stub

存根是一个对象,您不打算对任何事情提出任何反对。您使用存根来插入方法返回值的默认值,或将呼叫拨打到void方法。

在存根对象上调用 .Verfiyxxxx不会产生效果,因为根据定义,一个存根不会跟踪该对象是如何与之交互的,它只是知道"何时调用方法x(),而是执行其他操作"。

模拟

如果您想与对象进行互动,例如该方法被称为4次,或者用特定的参数调用一种方法,然后您需要模拟对象。使用模拟需要调用Expect(这取决于您使用的模拟框架,但通常是Expect

最新更新