2009-04-08 26 views
49

Tôi có một đối tượng giả được truyền qua như một đối số hàm tạo cho đối tượng khác.Rhino Mocks AssertWasCalled (nhiều lần) trên thuộc tính getter bằng cách sử dụng AAA

Làm cách nào tôi có thể kiểm tra thuộc tính của đối tượng được giả mạo đã được gọi? Đây là mã tôi đang sử dụng hiện tại:

INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>(); 
newContact.Stub(x => x.Forenames).Return("One Two Three"); 
someobject.ConsumeContact(newContact); 
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }); 

Công trình này ngoại trừ khi sử dụng "someobject" getter trên tài sản Tên gọi nhiều lần. Đó là khi tôi nhận được "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames(); dự kiến ​​# 1, # 2 thực tế .."

Đơn giản chỉ cần sử dụng

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any()); 

không hoạt động và cung cấp cho các lỗi dưới đây :

"Kỳ vọng đã bị xóa khỏi danh sách mong đợi chờ đợi, bạn có gọi Repeat.Any() không? Điều này không được hỗ trợ trong AssertWasCalled()."

Vậy làm cách nào để phục vụ cho nhiều cuộc gọi?

+1

Nhấp vào ✓ dưới đây là một trong những câu trả lời để chấp nhận nó. – lockstock

Trả lời

70

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Repeat.Any không làm việc với AssertWasCalled vì 0 đếm như bất kỳ .. Vì vậy, nếu nó không được gọi là, AsserWasCalled sẽ trả về TRUE ngay cả khi nó không được gọi.

+3

Cảm ơn, điều này đã giúp tôi tiết kiệm thời gian. Nên là câu trả lời tốt nhất cho câu hỏi (IMO) – Thies

2

Động lực của bạn đằng sau việc kiểm tra số lần nó được gọi là gì? Nó là một hoạt động đặc biệt đắt tiền? Nếu vậy, sau đó tôi sẽ đề nghị bạn đặt nó đằng sau một phương pháp thay vì, ngữ nghĩa nói, tài sản nên được các cuộc gọi không tốn kém.

Ngoài ra, kiểm tra số lần một thuộc tính được gọi không phải là lực đẩy kiểm tra đơn vị (đừng lo lắng đó là một sai lầm phổ biến để kiểm tra quá nhiều, tất cả chúng ta đã có). Những gì bạn thực sự nên được thử nghiệm là cho rằng nhà nước của đối tượng giả của bạn rằng phương pháp sản xuất sản lượng dự kiến. Số lần một phương thức được gọi để làm điều đó không thực sự quan trọng (trừ khi đó là một dịch vụ để gửi một email hoặc một cái gì đó). Nó là một chi tiết thực hiện mà bạn thường không kiểm tra như một trình tái cấu trúc đơn giản sẽ phá vỡ các thử nghiệm của bạn vì chúng sẽ quá cụ thể.

+0

Cảm ơn Garry. Tôi thực sự không muốn kiểm tra bao nhiêu lần getter được gọi, chỉ đơn thuần là nó được gọi. Khi nó xảy ra "someobject" sử dụng nó trong nội bộ hai lần. Đó là nguyên nhân của vấn đề; dường như không có cách nào để sử dụng .Repeat.Any() với AssertWasCalled. – Confused

+0

Nhưng thường xác minh rằng đầu ra là chính xác xác minh rằng tài sản được gọi. Làm thế nào đầu ra có thể đúng nếu tài sản không được gọi? –

+0

Garry, ý kiến ​​của bạn là hợp lệ, nhưng bạn cũng phải nói rằng về cơ bản có hai trường thử nghiệm mô phỏng: dựa trên trạng thái và dựa trên tương tác. Xác nhận số lần một phương thức được gọi là hoàn toàn hợp lệ trong thử nghiệm dựa trên tương tác. Và đôi khi nhà nước không thay đổi. –

0

newContact.Expect (c => c.ForeNames) .Return (...) .Repeat.Any()

2

Tùy thuộc vào phiên bản của tê giác bạn đang sử dụng, bạn có thể sử dụng:

// Call to mock object here 
LastCall.IgnoreArguments().Repeat.Never(); 
26

Tôi đồng ý với chris câu trả lời

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce()); 

Ngoài ra Nếu bạn biết chính xác bao nhiêu lần tài sản sẽ được gọi là bạn có thể làm

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n)); 

trong đó n là int.

0

Từ Here:

mock.AssertWasCalled(x => x.Name ="Bob"); 

hoặc

mock.AssertWasCalled(x => x.Name =Arg.Is("Bob")); 

hoặc

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull); 
+1

Câu trả lời này sẽ không hoạt động, bởi vì bạn sẽ stil khẳng định phương pháp được gọi một lần. Câu hỏi đặt ra là khẳng định rằng phương pháp này được gọi nhiều lần. – Peter

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