2010-06-25 31 views
17

Tôi gọi _mocks.ReplayAll(), sau đó một hoặc nhiều _mockedObject.AssertWasCalled() và sau đó _mocks.VerifyAll(). Nhưng nó nói với tôi rằng "Hành động này không hợp lệ khi đối tượng giả ở trạng thái ghi".Làm thế nào để sử dụng Rhino.Mocks AssertWasCalled() một cách chính xác?

[Test] 
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused() 
{ 
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused }; 
    _taskDataProvider.Expect(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused)); 
    _mockRepository.ReplayAll(); 
    _manager.SetStateExecuting(task); 
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, 
                    TaskState.Executing)); 
    _mockRepository.VerifyAll(); 
} 

theo đúng thứ tự để gọi để những phương pháp làm việc một cách chính xác là gì?

Trả lời

-1

Có vẻ như tôi đã tìm ra giải pháp. Nó có vẻ hơi lạ, nhưng nó hoạt động. Nó chỉ ra rằng tôi cần phải gọi ReplayAll() hai lần đối với một số lý do ...

này hoạt động:

[Test] 
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused() 
{ 
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused }; 
    _mockRepository.ReplayAll(); 
    _manager.SetStateExecuting(task); 
    _taskDataProvider.AssertWasCalled(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused)); 
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, TaskState.Executing)); 
    _mockRepository.ReplayAll(); 
} 
+2

Chào bạn, Có thể hữu ích để chứng tỏ bạn đang tuyên bố _manager vv Tôi thường không cần phải làm cho nó trở nên phức tạp. Cũng thấy mã bạn đang thử nghiệm có thể hữu ích. Nếu bạn đang tìm kiếm để có được Rhino Mocks giúp tôi phải nói rằng tôi đã giúp đỡ từ các đồng nghiệp mà còn từ cuốn sách "Nghệ thuật kiểm tra đơn vị" http://www.manning.com/osherove/ – ArtificialGold

12

Bạn đang trộn mô hình Ghi/Replay cũ và mới AAA pattern.

Cách thông thường để thiết lập một "không được gọi với những lập luận" kỳ vọng trong khi ở chế độ Ghi trông như thế này:

_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never(); 

Hoặc cách khác, bạn có thể sử dụng một mô hình nghiêm ngặt mà chỉ đơn giản không cho phép bất ngờ cuộc gọi.

AssertWasCalledAssertWasNotCalled dành cho AAA nơi bạn đặt xác nhận của mình ở cuối. Với cú pháp Record/Replay, cả hai hành vi và expecations nên được thiết lập ở đầu trước khi chuyển sang chế độ phát lại.

(AssertWasNotCalled thực sự có thể làm việc với Ghi/Replay cũng có, nhưng tôi chưa bao giờ thử nó bởi vì tôi không muốn pha trộn các yếu tố từ cả hai phương pháp. Nó không cần thiết làm phức tạp mọi thứ.)

16

bài đăng blog Jon Kruger của "How to use rhino mocks documented through tests" có đơn giản ví dụ về mọi thứ bạn có thể làm với phương pháp giả lập tê giác. Ông cũng cho thấy những gì bạn không thể làm mà tôi thấy rất hữu ích trong việc học.

Như đã đề cập trước đó, việc sử dụng Cú pháp sắp xếp, Đạo luật, Assert với các hàm tạo tĩnh sẽ dễ đọc hơn. Bài đăng blog hiển thị các ví dụ về cả hai phương pháp.

Dưới đây là những ví dụ từ mẫu mã của Jon:

New cú pháp:

[Test] 
    public void You_can_check_to_see_if_a_method_was_called() 
    { 
     var stub = MockRepository.GenerateStub<ISampleClass>(); 

     stub.MethodThatReturnsInteger("foo"); 

     stub.AssertWasCalled(s => s.MethodThatReturnsInteger("foo")); 
     stub.AssertWasCalled(s => s.MethodThatReturnsInteger(Arg<string>.Is.Anything)); 
    } 

Cũ phong cách:

[Test] 
    public void Calling_virtual_methods_will_call_the_actual_method() 
    { 
     var mockRepository = new MockRepository(); 
     var sampleClass = mockRepository.PartialMock<SampleClass>(); 
     sampleClass.Replay(); 

     sampleClass.VirtualMethod("foo").ShouldEqual(3); 
     sampleClass.VirtualMethodWasCalled.ShouldBeTrue(); 
     sampleClass.AssertWasCalled(c => c.VirtualMethod("foo")); 
    } 
Các vấn đề liên quan