2009-07-02 65 views
11

Tôi đang thử nghiệm một số lớp tôi đã tạo bằng cách sử dụng mocks, nhưng tôi đã thấy tất cả các khuôn khổ mocking miễn phí trong C# không thể giả lập các phương thức không ảo (nếu nó là không phải trong một giao diện).Mocking phương pháp không ảo trong C#

Nhưng, có TypeMock có thể thực hiện việc này, vì vậy, điều đó là có thể. Bất cứ ai có thể cho thấy làm thế nào để làm điều đó? Tôi thậm chí có thể cố gắng đóng góp cho một khung công tác nguồn mở nếu tôi có thể làm được điều này.

Cảm ơn trước

+0

Đoán tốt nhất, kết hợp AppDomains, Reflection.Emit và một chút công bằng về hackery và phép thuật. Nhưng tôi hầu như không đủ điều kiện để làm cho nhiều người được giáo dục đoán về điều này. –

+0

thêm thẻ typemock – BengtBe

+0

Xem thêm http://stackoverflow.com/questions/2187513/how-to-make-a-unit-test-mock-of-an-object-with-non-virtual-functions/6690183 –

Trả lời

7

Theo website nó sử dụng AOP để chuyển hướng cuộc gọi:

Typemock Isolator sử dụng công nghệ khía cạnh định hướng để chuyển hướng cuộc gọi từ các mã thực. Điều này cho phép các nhà phát triển xác định hành vi của thành phần bên ngoài cần thiết cho một kịch bản thử nghiệm. Ví dụ, bạn có thể mô phỏng rằng đĩa đầy khi viết vào cơ sở dữ liệu bằng cách hướng dẫn Typemock Isolator để ném một OutOfDiskSpaceException khi ghi vào cơ sở dữ liệu. Đây là một kịch bản sẽ gần như không thể kiểm tra mà không có Typemock Isolator. Nhà phát triển xác định hành vi trong thử nghiệm đơn vị thực tế và Bộ cách ly Typemock tự động cô lập tất cả các thành phần được yêu cầu.

Kỹ thuật này yêu cầu bạn thiết lập môi trường đặc biệt trước khi bạn có thể chạy thử nghiệm hoặc sử dụng plugin VS.

Một số người nghĩ rằng khả năng giả lập mọi thứ khiến Typemock quá mạnh, vì bạn không phải suy nghĩ quá nhiều về thiết kế tốt. Một báo giá từ Ayende:

Điểm yếu chính của Type Mock là sức mạnh của nó, nó cho phép tôi thực hiện các phím tắt mà tôi không muốn thực hiện, tôi muốn có được một hệ thống kết nối thấp và gắn kết cao.

Nhưng tất nhiên kể từ khi ông là creater của Rhino Mock ông không phải là mục tiêu :)

tôi sẽ nghĩ rằng bạn đang ở trong một rất nhiều công việc nếu bạn muốn tạo ra một khuôn khổ mocking với chức năng này , vì vậy tôi khuyên bạn nên mua Typemock hoặc tìm hiểu mã mà không cần nó :)

+0

Bạn cần phải thiết lập một môi trường đặc biệt trước khi chạy TypeMock (có một plugin VS cho điều này), và tôi đồng ý về TypeMock có "nhiều hơn dây đủ để treo mình với" –

+0

Cảm ơn Blair, cập nhật bài viết để phản ánh bình luận của bạn! – BengtBe

+0

Vâng, tôi đoán các kịch bản chính cho typemock là nếu bạn cần làm việc với hệ thống kế thừa hoặc bên thứ 3 nơi bạn không thể (dễ dàng) thay đổi thiết kế và bạn vẫn muốn thêm các bài kiểm tra đơn vị và thử một số thứ nhất định. – ChrisWue

14

Tôi đến từ Typemock và tôi sẽ không giải quyết các nhận xét "Quá mạnh mẽ" (mặc dù nó vượt xa tôi tại sao mọi người không muốn để sử dụng công cụ tốt nhất cho công việc).

Đây là cách thức hoạt động của Máy đánh chữ Typemock. Bạn đã bao giờ sử dụng một hồ sơ hiệu suất chưa? Isolator là một profiler. Nó móc vào CLR và trong thời gian chạy thử nghiệm, nó thay đổi phương thức. Khi một phương thức được JITted, nó thay đổi nó, vì vậy khi phương thức chạy, trước khi thực thi mã gốc, nó sẽ hỏi: tôi có nên chạy nó như dự định ban đầu hay không, và nếu không, tôi nên làm gì? Và bởi vì công nghệ cụ thể này, nó có thể chế tạo bất kỳ phương thức và công nghệ Net nào. Đó là nó.

Khi bạn đặt hành vi sử dụng API, câu trả lời cho các câu hỏi giờ đây sẽ trở thành intersting và thay đổi hành vi khi chạy theo phương thức đó. Đơn giản, nhưng dưới nắp nó có rất nhiều công việc :)

Bộ cách ly đi kèm với VS AddIn để chạy thử nghiệm liền mạch trong VS và với công cụ dòng lệnh và MSBuild hoặc công việc NAnt để sử dụng trong máy chủ xây dựng.

Tôi rất sẵn lòng trả lời bất kỳ câu hỏi nào khác mà bạn có thể có.

+2

Bạn phải thật sự tuyệt vời khi không sử dụng dao sắc nhọn! ;). Tôi đoán đó là ý nghĩa của những nhận xét "quá mạnh". –

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