Подтвердить что ты не робот

Как настроить вызов Expect для проверки того, что метод не вызван в Rhino Mocks

Использование Rhino Mocks, как я могу гарантировать, что метод не вызывается при настройке ожиданий на макет объекта.

В моем примере, я тестирую метод Commit, и мне нужно убедиться, что метод Rollback не вызывается во время выполнения commit. (это потому, что у меня есть логика в методе фиксации, которая автоматически откатывается, если фиксация завершается с ошибкой)

Вот как выглядит код.

[Test]
public void TestCommit_DoesNotRollback() 
{
    //Arrange
    var mockStore = MockRepository.GenerateMock<IStore>();
    mockStore.Expect(x => x.Commit());
    //here i want to set an expectation that x.Rollback() should not be called.

    //Act
    subject.Commit();

    //Assert
    mockStore.VerifyAllExpectation();
}

Конечно, я могу сделать это на этапе Assert следующим образом:

mockStore.AssertWasNotCalled(x => x.Rollback());

Но я хотел бы установить это как Ожидание в первую очередь.

4b9b3361

Ответ 1

Другой вариант:

mockStore.Expect(x => x.Rollback()).Repeat.Never();

Ответ 2

Это то, что вы ищете?

ITest test = MockRepository.GenerateMock<ITest>();
test.Expect(x => x.TestMethod()).AssertWasNotCalled(mi => {});

Ответ 3

Вот еще один вариант:

        mockStore.Stub(x => x.DoThis()).Repeat.Times(0);

        //EXECUTION HERE 

        x.VerifyAllExpectations();

Ответ 4

В этом случае я создал метод расширения, чтобы лучше показать мое намерение

public static IMethodOptions<RhinoMocksExtensions.VoidType> ExpectNever<T>(this T mock, Action<T> action) where T : class
{
    return mock.Expect(action).IgnoreArguments().Repeat.Never();
}

Обратите внимание на вызов IgnoreArguments(). Я предполагаю, что вы не хотите, чтобы метод вызывался когда-либо... независимо от того, какое значение параметра имеет значение.