我试图测试一个方法被调用了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次?
发布于 2015-05-19 08:25:07
存根按定义不会检查期望,也见这。
但是,您可以只通过调用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));发布于 2015-05-19 07:49:23
我不熟悉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()时,执行其他操作”。
Mock
如果希望断言与对象的交互(例如,调用方法4次,或者使用特定的参数集调用方法),则需要一个模拟对象。使用模拟需要调用Expect (这取决于您使用的模拟框架,但通常是Expect)
https://stackoverflow.com/questions/30318510
复制相似问题