![](/img/trans.png)
[英]RhinoMocks: how to test if method was called when using PartialMock
[英]How to ensure that a method is not called anymore in RhinoMocks?
我有一個代碼,看起來像下面的示例:
public interface IDependency
{
void Foo();
}
public class MainClass{
Timer tmr = new Timer(100);
IDependency dependency;
public MainClass(IDependency dep)
{
dependency = dep;
tmr.Elapsed += OnElapsed;
}
void OnElapsed(object sender, EventArgs e)
{
dependency.Foo();
}
public void Start()=> tmr.Start();
public void Stop() => tmr.Stop();
}
我想使用RhinoMock和/或nunit進行單元測試,一旦調用“ Stop”,就不再調用IDependency.Foo
使用BackToRecord
和ReplayAll
嘗試,但未能達到目標。 調用Stop()
之后,調用AssertWasNotCalled
不會失敗。
有什么辦法可以達到同樣的效果嗎?
由於定時器的間隔是已知的,因此您可以等待設置的時間,並計算定時器調用Foo
。
例如
[TestMethod]
public async Task MainClass_Should_Stop() {
//Arrange
var dependency = Substitute.For<IDependency>();
var subject = new MainClass(dependency);
var expectedDelay = 200;
var expectedCalls = 2;
//Act
subject.Start();
await Task.Delay(expectedDelay);
subject.Stop();
await Task.Delay(100);
//Assert
dependency.Received(expectedCalls).Foo();
}
盡管以上使用NSubstitute,但可以將其應用於您選擇的模擬框架。
如果我將預期延遲更改為一個會導致預期調用不同的延遲,則測試將失敗。
例如,當延遲設置為100ms並且呼叫保持在2時,它將失敗,因為只會發生一個呼叫。
遵循Nkosi的答案后,您將如何使用Rhino Mocks(請參閱此問題中的一些討論):
[Test]
public async Task MainClass_Should_Stop() {
//Arrange
var dependency = MockRepository.GenerateMock<IDependency>();
var subject = new MainClass(dependency);
var expectedDelay = 200;
var expectedCalls = 2;
//Act
subject.Start();
await Task.Delay(expectedDelay);
subject.Stop();
await Task.Delay(100);
//Assert
dependency.AssertWasCalled(
dependency => dependency.Foo(),
options => options.Repeat.Times(expectedCalls)
);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.