2009-05-31 1 views
9

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

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

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

Это аналогичный код в другом тесте делает работу без проблем

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

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

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

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

ответ

12

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

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

+1

Я только что прочитал об этом сегодня. Ссылка на документацию к вики-записи Rhino Mocks: http://ayende.com/Wiki/(S(vcy2bn55h5cja0vsedn14y45))/Rhino+Mocks+-+Internal+Methods.ashx –

0

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

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

Тогда мой синтаксис получает немного cleamer (спасибо :)), к сожалению, мой тест все еще бросает – Crippledsmurf

+0

Любое значение для нулевого параметра в конструкторе. Что произойдет, если вы передадите действительный объект вместо нуля? – tvanfosson

+0

Обычно они являются объектами IPAddress, которые передаются реальным контроллером. Они являются нулевыми, потому что их более удобно печатать, чем что-либо еще (это 3:47 утра), но прямо сейчас, когда этот метод является пустым, который не использует параметры где-либо Я тоже пробовал их с реальными значениями параметров, я все равно получаю то же исключение Я думаю, что это признак того, что я официально слишком стар, чтобы кодировать это поздно. – Crippledsmurf

Смежные вопросы