![](/img/trans.png)
[英]RhinoMocks - when a method is called n times, how to test its parameters in the n - k call
[英]How to set a maximum/upper bound for method calls in RhinoMocks with the Times() method?
我正在嘗試測試一種方法在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次?
我對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);
編輯:
只是為了擴展:
存根
存根是一個您不希望對其進行任何聲明的對象。 您可以使用存根插入方法返回值的默認值,也可以存根對void
方法的調用。
在存根對象上調用.Verfiyxxxx
不會產生任何效果,因為根據定義,存根無法跟蹤該對象是如何與之交互的,它只是知道“調用方法x()時,執行此其他操作”。
嘲笑
如果您想斷言與某個對象的交互(例如,一個方法被調用了4次,或者一個方法被調用帶有一組特定的參數),則需要一個模擬對象。 使用模擬需要調用Expect
(這取決於您使用的模擬框架,但通常是Expect
)
根據定義,存根將不檢查期望,另請參閱this 。
但是,您可以簡單地通過調用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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.