Я не думаю, что вы можете сбросить макет, как это. Вместо этого, если вы знаете, что Fizz
необходимо вызвать один раз при переходе в состояние 1, вы можете выполнить свои проверки следующим образом:
objectUnderTest.DoStuffToPushIntoState1();
foo.Verify(x => x.Fizz(), Times.Once()); // or however many times you expect it to be called
objectUnderTest.DoStuffToPushIntoState2();
foo.Verify(x => x.Fizz(), Times.Once());
Сказав это, я все равно создал бы два отдельных теста для этого. Как два теста, легче увидеть, происходит ли переход в состояние 1 или переход в состояние 2. Кроме того, при совместном тестировании, подобном этому, если ваш переход в состояние 1 завершается неудачно, метод тестирования завершается, а ваш переход в состояние 2 не проходит проверку.
Редактировать
В качестве примера я протестировал следующий код с xUnit:
[Fact]
public void Test()
{
var foo = new Mock<IFoo>(MockBehavior.Loose);
foo.Object.Fizz();
foo.Verify(x => x.Fizz(), Times.Once(), "Failed After State 1");
// stuff here
foo.Object.Fizz();
foo.Verify(x => x.Fizz(), Times.Once(), "Failed after State 2");
}
Этот тест завершается неудачно с сообщением «Ошибка после состояния 2». Это имитирует то, что произойдет, если ваш метод, который помещает foo в State 2, вызывает Fizz
. Если это произойдет, второй Verify
не удастся.
Рассматривая свой код еще раз, поскольку вы вызываете один метод, чтобы проверить, вызывает ли он / не вызывает другой метод на макете, я думаю, вам нужно установить CallBase
в true
, чтобы базовая DoStuffToPushIntoState2
была называется, а не отменять насмешку.