簡體   English   中英

如何確保RhinoMocks中不再調用某個方法?

[英]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

使用BackToRecordReplayAll嘗試,但未能達到目標。 調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM