Sự khác biệt giữa giả và cuống trên Rhino Mocks là gì?


149

Tôi không chơi đủ với cái này và thường sử dụng giả, nhưng tôi tự hỏi sự khác biệt giữa hai cái này và khi nào nên sử dụng cái này hay cái kia trên Rhino Mocks.

Cập nhật:

Tôi cũng tìm thấy câu trả lời cho câu hỏi của mình bằng lời của Ayende :

Sự khác biệt giữa sơ khai và giả lập

Bạn có thể có được định nghĩa thực tế của các thuật ngữ này trong bài viết này: Mocks Ar't Stub . Tôi muốn tập trung vào sự khác biệt từ quan điểm của Rhino Mocks.

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

Nếu bạn muốn xác minh hành vi của mã đang được thử nghiệm, bạn sẽ sử dụng một bản giả với kỳ vọng thích hợp và xác minh điều đó. Nếu bạn chỉ muốn vượt qua 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 sơ khai.

QUAN TRỌNG: Một sơ khai sẽ không bao giờ làm cho một bài kiểm tra thất bại.


Câu trả lời:


148

Theo điều này

... Nói một cách đơn giản, có một sự khác biệt giữa các đối tượng Mock và Stub và RhinoMocks nhận ra rằng cho phép chúng ta viết các bài kiểm tra thể hiện rõ hơn mục đích của chúng.

Các đối tượng giả được sử dụng để xác định các kỳ vọng tức là: Trong kịch bản này, tôi mong đợi phương thức A () được gọi với các tham số như vậy và như vậy. Mocks ghi lại và xác minh những kỳ vọng như vậy.

Mặt khác, Stub có một mục đích khác: chúng không ghi lại hoặc xác minh các kỳ vọng, mà cho phép chúng tôi thay thế hành vi, trạng thái của đối tượng giả mạo giả để sử dụng kịch bản thử nghiệm ...


Tôi tìm thấy một bài viết hữu ích khác lặp lại thông điệp tương tự như câu trả lời được chấp nhận cho câu hỏi này - martinfowler.com/articles/mocksArentStub.html .
singh1469

20

Nói chung, Đơn vị kiểm tra các chức năng và phương thức gọi, sau đó kiểm tra xem liệu hành vi dự kiến ​​đã xảy ra. Các hàm và phương thức này có thể yêu cầu tham số. Chúng tôi sử dụng sơ khai và giả để đáp ứng các tham số này. Đôi khi chúng ta cũng có thể chế giễu các đối tượng toàn cầu.

Sơ khai

Stub là một đối tượng giả nhỏ mà bài kiểm tra của bạn có thể sử dụng làm tham số để thực hiện cuộc gọi chức năng. Điều này cho phép chúng tôi xác minh hành vi của chức năng được thử nghiệm. Nó không cho phép chúng tôi xác minh bất kỳ tác dụng phụ nào, vì sơ khai không có triển khai.

Giả

Một Mock là một sơ khai với một thực hiện. Nếu chức năng của chúng tôi được thử nghiệm tương tác với đối tượng giả của chúng tôi, chúng tôi có thể xác minh rằng giả đã được tương tác với chúng tôi mong đợi.

Ví dụ: giả sử chúng tôi có một đối tượng Người dùng giả và chúng tôi muốn xác minh rằng phương thức session.login của chúng tôi đã hoạt động, chúng tôi có thể muốn kiểm tra xem user.lastLoggedIn đã được đặt. Chúng tôi có thể tạo một Người dùng giả thực hiện phương pháp này. Khi chúng tôi gọi session.login, chúng tôi có thể khẳng định rằng user.lastLoggedIn có trạng thái mà chúng tôi mong đợi.

Tóm lại

Mock là một sơ khai với một thực hiện, cho phép chúng tôi kiểm tra tác dụng phụ.

Sự khác biệt này vẫn còn quan trọng?

Thay vì giống như sự khác biệt giữa similes và ẩn dụ, sự khác biệt giữa cuống và giả là tinh tế và lịch sử, và có lẽ có liên quan nhiều đến các cộng đồng và triết lý khác nhau trong thế giới thử nghiệm hơn bất kỳ sự khác biệt kỹ thuật chính nào.

Họ đại diện cho các cách tiếp cận hơi khác nhau để thử nghiệm. Một mock có thể được viết như sơ khai. Một cuống thường có thể được mở rộng thành một giả.

Bạn nên sử dụng loại nào?

Bạn có thể thấy rằng bạn bắt đầu tạo sơ khai, sau đó bạn có thể thấy rằng bạn cần tạo đầy đủ trên các bản giả cho một số đối tượng của bạn. Bạn có thể muốn chế giễu mọi thứ khi bạn đi, hoặc bạn có thể chỉ muốn chế giễu ở những nơi cần thiết.


7

Sự khác biệt giữa Mock và stub: với sơ khai, bạn sửa lỗi đầu vào của bài kiểm tra đơn vị của mình: vì vậy bài kiểm tra đơn vị của bạn không đưa ra khẳng định về sơ khai và sơ khai bằng cách viết lại việc thực hiện một số phương pháp khắc phục hành vi của đối tượng giả. với Mock, bạn sửa lỗi thông số của bài kiểm tra đơn vị của mình: vì vậy bài kiểm tra đơn vị của bạn tạo ra một kỳ vọng vào đối tượng Mocking của bạn bằng cách kiểm tra tương tác bên trong trong đối tượng giả của bạn.


Có vẻ như bạn đang nói rằng bài kiểm tra của bạn nên "kiểm tra" đầu ra của một bản giả. Nếu đó là những gì bạn đang nói, bạn không chính xác. Một giả được cho là không được thử nghiệm; Nó ở đó để bạn có thể kiểm tra mã khác . Hay câu cuối cùng của bạn có ý nghĩa gì khác?
Andrew Barber

1
Xin chào Andrew, như tôi đã viết với Mock, bạn sửa lỗi đầu ra của bài kiểm tra để bạn không kiểm tra nó. Ngược lại, tôi đã viết rằng Mock cho phép bạn kiểm tra sự tương tác (hành vi mong đợi ... ;-)
Hassan Boutougha

1
OK, điều đó có ý nghĩa hơn. Cảm ơn bạn đã làm rõ!
Andrew Barber

> không thực hiện xác nhận trên sơ khai Tại sao trong nhiều thư viện xác nhận vẫn tồn tại các phương thức aka should have been called withđể xác nhận stubtham số.
hellboy

5

Trong trường hợp khung Moq - phương thức thiết lập là STUB trong đó phương thức Xác minh là Mock


0

Một điều mà tôi cũng nhận thấy là khi tôi sử dụng MockRep repository.GenerateMock, tôi cần đặt rõ ràng các kỳ vọng vào một cuộc gọi phương thức cụ thể để chặn cuộc gọi đó. Với sơ khai, nó dường như tự động chặn bất kỳ phương thức nào miễn là ảo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.