2009-05-20 22 views
11

Bất cứ ai có thể cho tôi biết tại sao trên thế giới thử nghiệm sau đây không phải là thất bại?Rhino Mocks: Repeat.Once() không hoạt động?

[Test] 
public void uhh_what() { 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Expect(x => x.Notify()).Repeat.Once(); 
    a.Notify(); 
    a.Notify(); 
    a.VerifyAllExpectations(); 
} 

Thực sự cần một cặp mắt thứ hai để xác nhận tôi không điên ... bây giờ tôi lo lắng rằng tất cả các thử nghiệm của tôi không đáng tin cậy.

Trả lời

23

Đã có thread on the RhinoMocks group.

GenerateMock tạo mô hình động. Mô phỏng động cho phép các cuộc gọi không được chỉ định (= mong đợi). Nếu điều này xảy ra, nó chỉ trả về null (hoặc giá trị mặc định của kiểu trả về).

Lưu ý: Lặp lại là đặc điểm kỹ thuật của hành vi (như Stub), không phải là kỳ vọng ngay cả khi được chỉ định trong kỳ vọng.

Nếu bạn muốn tránh việc nhiều hơn thì một số lượng nhất định các cuộc gọi, bạn có thể viết:

[Test] 
public void uhh_what() 
{ 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Expect(x => x.Notify()).Repeat.Once(); 
    a.Stub(x => x.Notify()).Throw(new InvalidOperationException("gotcha")); 
    a.Notify(); 

    // this fails 
    a.Notify(); 

    a.VerifyAllExpectations(); 
} 

Hoặc

[Test] 
public void uhh_what() 
{ 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Notify(); 
    a.Notify(); 

    // this fails 
    a.AssertWasCalled(
     x => x.Notify(), 
     o => o.Repeat.Once()); 
} 
+1

oh! Tôi không biết rằng AssertWasCalled đã có một đối số thứ hai, nơi bạn có thể làm thêm thông số kỹ thuật, điều này thay đổi tất cả mọi thứ! –

+1

Đó là vấn đề tương tự với PartialMock, nếu bạn từng bước vào nó. – Dennis

+1

Giải pháp đầu tiên (nơi bạn ném một ngoại lệ) _will_ thực hiện kiểm tra thất bại nếu 'Thông báo' được gọi nhiều lần. Tuy nhiên, nếu nó chỉ được gọi một lần (ít nhất đó là những gì tôi giả định mã đang được kiểm tra nên làm), kiểm tra sẽ không vượt qua vì nó nên bởi vì nó mong đợi một cuộc gọi _second_ để 'Notify' mà không bao giờ đến. Thiết lập 'a.Expect (x => x.Notify()). Repeat.Once()' theo sau bởi 'a.Stub (x => x.Notify()). Ném (...)' để làm việc làm. – geoffmazeroff

7

Khi sử dụng GenerateMock (hoặc với Dynamic Mocks nói chung) Tôi luôn luôn chèn một cách tinh thần những điều sau đây:

a.Expect (x => x.Notify()). * [AtLeast] * Once();

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