C# 如何使用Times()方法为Rhinomock中的方法调用设置最大值/上限?
我试图测试一个方法是否被调用了3到4次: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
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()语法按照我的预期工作。