Когда фиктивный объект входит в состояние воспроизведения? - PullRequest
9 голосов
/ 31 мая 2009

При выполнении второй строки этого кода Rhino Mocks генерирует исключение InvalidOperationException с сообщением «Это действие недопустимо, когда фиктивный объект находится в состоянии воспроизведения»

var mockScanner = MockRepository.GenerateMock<PortScanner>(null);
        mockScanner.Expect((scanner => { scanner.Scan(null, null); }));

Проходя по коду в отладчике, можно увидеть, как отладчик запускает метод, определенный в классе, и сразу после выхода из этого метода возникает исключение.

Этот похожий код в другом тесте работает без проблем

var mockView = MockRepository.GenerateMock<IScanView>(null);
        mockView.Expect(view => { view.Close(); });
        var controller = new ScanController(mockView);
        controller.Exit();
        mockView.VerifyAllExpectations();

Единственное различие, которое я могу придумать, может иметь какое-либо значение между этими двумя тестами, состоит в том, что Exit является членом интерфейса, а Scan является виртуальным членом класса

Чего мне не хватает?

Обновление
Дальнейшие исследования показали, что это связано с тем, как Rhino обрабатывает виртуальные методы. Сейчас я сосредоточен на изучении документации

Ответы [ 2 ]

12 голосов
/ 01 июня 2009

Исключение было вызвано тем, что у Rhino Mocks не было требуемого уровня доступа к типу, чтобы правильно его смоделировать. Предоставление внутреннего доступа к сборке Rhino Mocks с использованием InternalsVisible, чтобы решить проблему.

Примечательно, что это не влияет на интерфейсы. Я полагаю, что причина этого заключается в том, что фреймворк должен переопределить реализацию в классе, где нет интерфейса.

0 голосов
/ 31 мая 2009

Что произойдет, если вы удалите лишний набор скобок из первого выражения?

var mockScanner = MockRepository.GenerateMock<PortScanner>(null);
mockScanner.Expect( scanner => { scanner.Scan(null, null); } );
...