Как вы утверждаете, что общий метод был вызван с Rhino Mocks? - PullRequest
0 голосов
/ 09 сентября 2010

У меня есть следующий тест, чтобы убедиться, что мой репозиторий вызывает соответствующий сеанс (я переписал его, чтобы выделить реальную проблему):

[Test]
    public void Why_Does_This_Fail()
    {
        var objectUnderTest = new SomeGenericsProblem();

        var fakeSession = MockRepository.GenerateMock<ISession>();
        fakeSession.Expect(s => s.Query<SomeClass>());

        objectUnderTest.NotWorking<SomeClass>();

        fakeSession.AssertWasCalled(t => t.Query<SomeClass>());
    }

но когда я запускаю тест, я получаю это:

System.InvalidOperationException: Неверный звонок, последний звонок был использовался или не был сделан звонок (сделать уверен, что вы звоните виртуальный (C #) / метод Overridable (VB)). (C #) / метод Overridable (VB)).

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

У меня такое ощущение, что это как-то связано с тем, что мой метод Query является универсальным, но я не знаю другого способа выразить то, что я пытаюсь проверить.

Также, если я удаляю часть, которая устанавливает ожидание (то есть эту строку кода:)

fakeSession.Expect(s => s.Query<SomeClass>());

Я получаю другое исключение, которое одинаково смущает меня:

System.InvalidOperationException: Нет ожидания были настроены, чтобы быть проверено, убедитесь, что вызов метода в действии виртуальный (C #) / вызов метода переопределения (VB.Net) вызов метода переопределения (VB.Net)

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

Итак, я выяснил, в чем дело.

ISession происходит из NHibernate, о чем я, вероятно, должен был упомянуть.

Причина, по которой это крайне важно, заключается в том, что

session.Query<T> 

(именно это я и пытаюсь высмеять) - это МЕТОД РАСШИРЕНИЯ .

Rhino Mocks, по-видимому, не обладает способностью насмешливых методов расширенияследовательно, почему это дает мне странную ошибку.

Так что, надеюсь, мне придется сэкономить кому-то еще время и муки, которые я пережил, пытаясь выяснить, почему мой тест не пройдет.

Единственное решение, о котором я читал для этого, - это на самом деле изменить дизайн метода расширения (что я не могу сделать, потому что он является частью NHibernate), или использовать другую инфраструктуру насмешек, такую ​​как TypeMock.

0 голосов
/ 09 сентября 2010
[Test]
public void Query_WhenCalled_CallsSessionQuery()
{
        // arrange
        var session = MockRepository.GenerateStub<ISession>();

        var r = new Repository(session);

        // act
        r.Query<SomeClass>();

        // assert
        session.AssertWasCalled(s => s.Query<SomeClass>());
}
...