2012-09-10 32 views
5

Nếu có thể thay đổi hành vi mô phỏng trong Rhino Mocks bằng mock.Stub(). Return(), tại sao chúng ta cần Sơ khai?Rhino Mocks - Chúng ta có thực sự cần cuống?

Chúng ta mất gì bằng cách luôn sử dụng MockRepository.GenerateMock()?

Một lợi ích lớn của việc sử dụng Mocks thay vì Sơ khai là chúng tôi sẽ có thể sử dụng lại cùng một trường hợp trong số tất cả các bài kiểm tra giúp chúng trở nên rõ ràng và đơn giản hơn.

Khuôn khổ moq hoạt động theo cách tương tự ... chúng tôi không có các đối tượng khác nhau cho mocks và sơ khai.

(làm ơn, đừng trả lời với một liên kết đến Fowler của "Mocks không cuống" bài viết)

Trả lời

3

Có một câu trả lời khá rõ ràng in the documentation:

Một mô hình là một đối tượng mà chúng ta có thể đặt kỳ vọng vào và điều này sẽ xác minh rằng các hành động mong đợi đã thực sự xảy ra. Cuống là một đối tượng mà bạn sử dụng để chuyển đến mã đang được kiểm tra. Bạn có thể kỳ vọng thiết lập trên đó, vì vậy nó sẽ hoạt động theo những cách nhất định, nhưng những mong đợi đó sẽ không bao giờ được xác minh. Thuộc tính của stub sẽ tự động hoạt động như các thuộc tính bình thường và bạn không thể đặt các kỳ vọng đối với chúng.

Nếu bạn muốn xác minh hành vi của mã đang được kiểm tra, bạn sẽ sử dụng mô hình với kỳ vọng phù hợp và xác minh điều đó. Nếu bạn chỉ muốn chuyển một giá trị có thể cần phải hành động theo một cách nhất định, nhưng không phải là trọng tâm của thử nghiệm này, bạn sẽ sử dụng một sơ khai.

QUAN TRỌNG: Sơ khai sẽ không bao giờ khiến thử nghiệm thất bại.

+0

Đây là khái niệm của sơ khai so với giả, nhưng như tôi đã nói trong câu hỏi, bạn có thể dùng một giả như một bài hát với Rhino. Vì vậy, trở lại câu hỏi của tôi, lợi ích của việc có hai đối tượng riêng biệt là gì? Chúng ta mất gì bằng cách sử dụng MockRepository.GenerateMock()? –

+0

Có, bạn * có thể * sử dụng mô hình làm cuống. Tuy nhiên, như đã nói ở trên, nếu bạn không bao giờ muốn giả tạo của bạn ảnh hưởng đến kết quả kiểm tra, thì hãy sử dụng một sơ khai. –

+0

Bạn có thể giải thích lý do tại sao? Điều gì về hiển thị một số mã để chứng minh đối số của bạn? –

6

Hãy nhớ rằng tê giác không còn được phát triển . khuôn khổ mới thả chênh lệch mô hình sơ khai này hoàn toàn và giới thiệu single hạn cho thử nghiệm của họ tăng gấp đôi:

Sự tiến hóa của moc khung làm việc của vua dường như đẩy về phía "một mục đích chung", thay vì có các khung riêng biệt khác nhau tùy thuộc vào ngữ cảnh của trường hợp thử nghiệm.

Để tìm hiểu thêm về cách mà tách (giả, cuống, giả) có nguồn gốc và mục đích gì nó phục vụ, tôi khuyên bạn nên đọc bài viết về Mark Seemann'scontinuum of test doubles:

Tại một cực đoan bạn sẽ tìm thấy núm vú cao su với hoàn toàn không thực hiện, và ở đầu kia là các triển khai sản xuất đầy đủ.Xác ướp và triển khai sản xuất đều được xác định rõ ràng, nhưng cuống, gián điệp và hàng giả khó nắm bắt hơn: khi nào một điệp viên thử nghiệm trở thành giả mạo? Ngoài ra, mocks tồn tại một khoảng thời gian khá lớn trong liên tục, vì chúng có thể khá phức tạp trong một số trường hợp nhưng rất đơn giản ở những người khác.


Nó có vẻ rằng tê giác không phân biệt giữa mô hình và sơ khai, nhưng có sự khác biệt tinh tế. Ví dụ: hãy cân nhắc việc nâng cấp tài sản cố định:

var mock = MockRepository.GenerateMock<IService>(); 
mock.Stub(m => m.Property).Return(42); 

Đây là cách bạn phải làm khi đối tượng giả. Stub Mặt khác, giới thiệu ngữ nghĩa tài sản, mà tầm thường hóa toàn bộ điều:

var stub = MockRepository.GenerateStub<IService>(); 
stub.Property = 42; 

Mặc dù đó là người duy nhất đó là đến tâm trí của tôi tại thời điểm này, có thể có một số chi tiết. Nhưng vẫn còn, đó chỉ là những sắc thái nhỏ.

1: Tính đến 2013/05/19, điều này có thể không còn giữ đúng: Rhino Mocks new home

+0

Tôi đã sử dụng moq trong một số dự án và tôi yêu thích! Nhưng bây giờ tôi đang làm việc trên một dự án sử dụng Rhino ... vì vậy, tôi đang cố gắng hiểu tại sao chúng ta không thể quên Sơ khai và sử dụng Mock cho cả hai mục đích với khung này giống như chúng ta làm với moq. –

+0

BTW, tks để chia sẻ bài viết ... Tôi sẽ xem! –

+1

@MarceloOliveira: Tôi khá chắc chắn nếu Rhino được phát triển, chúng tôi sẽ không có hai loại riêng biệt. Nói chung bạn nói đúng, không có nhiều khác biệt giữa stub và giả lập. Tuy nhiên, ** có ** một số (mặc dù nhỏ). Xem câu trả lời cập nhật của tôi cho ví dụ. –