Вам нужно использовать StrictMock. DynamicMock разрешит вызовы методов, которые не ожидаются. Таким образом, ваш вызов вашего метода ожидается три раза (что происходит). Но когда это происходит в четвертый раз, это не ошибка, поскольку вы определили его как DynamicMock (неожиданные вызовы разрешены).
Однако в долгосрочной перспективе использование StrickMock может быть головной болью при обслуживании, так как ваш тест слишком много знает о том, как пишется объект (так как вы должны смоделировать / заглушить все возможные вызовы).
Я бы порекомендовал синтаксис AAA (Arrange, Act, Assert) для ваших юнит-тестов. Ваш тест, описанный выше, может быть написан с использованием заглушки, но все же принудительно вызовите 3-пределный вызов для вашего метода:
IJobServiceEvent mockedJSE = MockRepository.GenerateStub<IJobServiceEvent>();
mockedJSE.TransactionListChanged(null);
mockedJSE.TransactionListChanged(null);
mockedJSE.TransactionListChanged(null);
mockedJSE.TransactionListChanged(null);
mockedJSE.AssertWasCalled(s => s.TransactionListChanged(null), o => o.Repeat.Times(3, 3));
UPDATE
Чтобы убедиться, что были сделаны только вызовы с определенными аргументами (хотя я думаю, что это в основном строгий макет, который может стать головной болью при обслуживании), трижды используйте параметр ограничений аргументов, чтобы убедиться, что эти вызовы выполнены. Затем создайте последний «AssertWasCalled», который игнорирует аргументы, и убедитесь, что он вызывался только три раза:
mockedJSE.AssertWasCalled(s => s.TransactionListChanged(null), o => o.IgnoreArguments().Repeat.Times(3, 3));