2009-05-31 34 views
9

Khi thực hiện dòng thứ hai của mã này Rhino Mocks ném một InvalidOperationException với một thông điệp "Hành động này là không hợp lệ khi các đối tượng giả ở trạng thái phát lại"Khi nào một đối tượng giả nhập vào trạng thái phát lại?

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

Đẩy mạnh thông qua các mã trong một trình gỡ lỗi người ta có thể thấy debugger chạy phương thức được định nghĩa trong lớp và trực tiếp sau khi kiểm soát rời khỏi phương thức này ngoại lệ xảy ra.

Mã này tương tự như trong thử nghiệm khác làm việc mà không vấn đề

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

Sự khác biệt duy nhất mà tôi có thể nghĩ rằng có thể là của bất kỳ consequense giữa theese hai bài kiểm tra là Exit đó là một thành viên trên một giao diện trong khi Scan là thành viên ảo trên một lớp học

Tôi đang thiếu gì?

Cập nhật
thăm dò sâu hơn đã chỉ ra rằng điều này có liên quan đến cách xử lý Rhino phương pháp ảo. Tôi đang tập trung nghiên cứu mmy của tài liệu tại đây ngay bây giờ

Trả lời

12

Trường hợp ngoại lệ đã được gây ra bởi vì Rhino Mocks không có mức độ cần thiết tiếp cận với các loại để châm biếm nó đúng cách. Cấp quyền truy cập nội bộ cho hội đồng Rhino Mocks bằng cách sử dụng InternalsVisibleTo để giải quyết vấn đề.

Đáng chú ý là điều này không ảnh hưởng đến giao diện. Tôi tin rằng lý do cho điều này là bởi vì khuôn khổ mocking cần phải ghi đè lên việc thực hiện trên một lớp mà không có gì trên một giao diện.

+1

Tôi vừa đọc về việc này hôm nay. Liên kết tài liệu tới mục nhập Rhino Mocks wiki là: http://ayende.com/Wiki/(S(vcy2bn55h5cja0vsedn14y45))/Rhino+Mocks+-+Internal+Methods.ashx –

0

Điều gì xảy ra nếu bạn xóa bộ ngoặc đơn bổ sung khỏi biểu thức đầu tiên?

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

Sau đó cú pháp của tôi nhận được một chút cleamer (cảm ơn :)), không may thử nghiệm của tôi vẫn ném – Crippledsmurf

+0

Bất kỳ ý nghĩa nào đối với tham số null trong hàm tạo. Điều gì sẽ xảy ra nếu bạn vượt qua trong một đối tượng hợp lệ ở đó thay vì null? – tvanfosson

+0

Chúng thường là các đối tượng IPAddress được điều khiển bởi một bộ điều khiển thực. Họ là null vì nó là convient hơn để loại hơn bất cứ điều gì khác (đó là 3:47 AM) nhưng ngay bây giờ mà phương pháp của một trống stub mà không sử dụng các tham số bất cứ nơi nào Tôi đã thử chúng với giá trị tham số thực quá, tôi vẫn nhận được cùng một ngoại lệ Tôi nghĩ đây là dấu hiệu cho thấy tôi đã chính thức quá cũ để được mã hóa vào cuối giờ này – Crippledsmurf

Các vấn đề liên quan