Как убедиться, что метод больше не вызывается в RhinoMocks? - PullRequest
1 голос
/ 26 июня 2019

У меня есть код, который выглядит как пример ниже:

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, но не смог достичь цели.Вызов AssertWasNotCalled не вызывает ошибки после вызова Stop().

Есть ли способ добиться того же?

Ответы [ 2 ]

1 голос
/ 23 июля 2019

Следуя ответу Нкоси, вот как вы это сделаете с Роксом Мохом (см. Также некоторые обсуждения в этот вопрос ):

[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)
  );
}
1 голос
/ 26 июня 2019

Поскольку интервал таймера известен, вы можете подождать установленное время и посчитать, сколько раз таймер вызвал 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, то же самое может быть применено с вашей системой выбора насмешки.

Если бы я изменил ожидаемую задержку на такую, из-за которой ожидаемые звонки могли бы отличаться, тогда тест не прошел бы.

Например, если задержка установлена ​​на 100 мс, а вызовы остаются на 2, то произойдет сбой, потому что произошел бы только один вызов.

...