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