Как я могу утверждать, что метод вызывается только один раз? - PullRequest
3 голосов
/ 10 сентября 2011
[Subject(typeof(OnceADayProcessor))]
public class When_processing_process_twice
{
    private static ICanBeProcessedOnceADay ProcessedOnceADay;

    private Establish context = () => { OnceADayProcessor.Now = () => new DateTime(2011, 1, 1, 0, 0, 0, 0); };

    private Because of = () =>
                             {
                                 ProcessedOnceADay = MockRepository.GenerateMock<ICanBeProcessedOnceADay>();
                                 ProcessedOnceADay.Process();
                                 ProcessedOnceADay.Process();
                             };

    private It should_execute = () => ProcessedOnceADay.AssertWasCalled(x => x.Expect(p => p.Process()));
    private It should_execute_only_once = () => ProcessedOnceADay.AssertWasNotCalled(x => x.Expect(p => p.Process()));
}

отредактированное решение:

[Subject(typeof(OnceADayProcessor))]
public class When_processing_a_process_twice_at_the_same_day
{
    static ICanBeProcessedOnceADay canBeProcessedOnceADay;

    Establish context = () =>
    {
        canBeProcessedOnceADay = A.Fake<ICanBeProcessedOnceADay>();
    };

    Because of = () =>
    {
        OnceADayProcessor.Process(canBeProcessedOnceADay);
        OnceADayProcessor.Process(canBeProcessedOnceADay);
    };

    It should_execute_only_once = () => 
        A.CallTo(() => canBeProcessedOnceADay.Process()).MustHaveHappened(Repeated.Exactly.Once);
}

Ответы [ 3 ]

4 голосов
/ 10 сентября 2011

Я бы заменил вызовы на stub.Expect() и stub.VerifyAllExpectations() на stub.AssertWasCalled(x => x.Process(), o => o.Repeat.Once()) в It.Если у вас есть более одного ожидания от заглушки, вы можете поместить каждое утверждение в один It и заставить их проваливаться (или успешно) независимо друг от друга.

Создание заглушки перейдет в Establish (по сути, создание любых зависимостей, а тестируемая система является частью фазы "упорядочения" в модульном тестировании).

Также учтите, что не следует использовать GenerateMock, но GenerateStub, так как имитации, вероятно, приведут кхрупкие тесты, когда вы вызываете другие методы, отличные от указанных в Expect.Такие библиотеки, как FakeItEasy, обычно предоставляют лучшие и более обнаруживаемые API, их легче освоить и вы попадете в «яму успеха».

4 голосов
/ 10 сентября 2011
var mock = MockRepository.GenerateMock<ICanBeProcessedOnceADay>();
mock.Expect(a => a.Process()).Repeat.Times(1);
...
mock.VerifyAllExpectations();
3 голосов
/ 02 марта 2015

Если вы хотите, чтобы метод вызывался только один раз, вам нужен строгий макет:

var mock = MockRepository.GenerateStrictMock<IShouldOnlyBeCalledOnce>();
mock.Expect(a => a.Process()).Repeat.Once();

sut.Process(mock)

mock.VerifyAllExpectations();

Если вы просто используете GenerateMock, он выполнит проверку «как минимум». Это также относится и к Repeats.Times (x).

...