2013-03-18 52 views
7

Hầu hết các khung mocking chỉ có khả năng mô phỏng các giao diện, một số có thể giả lập các phương thức ảo của các lớp. Một số khung công tác mô phỏng Java thậm chí còn có khả năng chế nhạo các lớp tĩnh.Làm thế nào để một khuôn khổ mocking hoạt động?

Ví dụ: Rhino mock:

var mock = MockRepository.GenerateMock<..>(); 

'ma thuật' nào đi xuống trong phương pháp tạo giả? Có một lý do tại sao C# mocking khuôn khổ không cho phép các lớp tĩnh mocking? Hay đó chỉ là 'sự lựa chọn thiết kế'?

+0

PS: googling các chủ đề chỉ mang lại cho tôi hướng dẫn làm thế nào để sử dụng một khuôn khổ mocking, không phải những gì tôi đang tìm kiếm – bas

+0

thử "ooo nhìn tôi * vẫy tay trong không khí * Tôi là một khuôn khổ ... ooo rất đặc biệt ":) – Eonasdan

+2

[moq] (https://code.google.com/p/moq/) là mã nguồn mở. –

Trả lời

4

Thực sự rất thú vị và hấp dẫn khi nhìn vào mã nguồn của các khung như vậy và tự tìm câu trả lời. Rhino Mocks là mã nguồn mở, cũng như Moqmany others. Tôi chắc chắn sẽ khuyên bạn nên lặn vào một trong số đó.

Đối với thực hiện nội bộ (từ here):

Tuy nhiên, khuôn khổ không thể thử phương pháp phi ảo, vì vậy chúng tôi cần phải thực hiện phương pháp TouchIron ảo. Lý do cho việc này nằm sâu bên trong: Rhino Mocks sử dụng Castle Dynamic Proxy để xử lý proxy các kiểu cần thiết, và Dynamic Proxy không thể chặn các cuộc gọi đến các phương thức không trừu tượng, không trừu tượng.

+0

Điều đó có thể giải thích tại sao các lớp tĩnh không được hỗ trợ, vì nó không có cách nào để chuyển hướng/proxy các cuộc gọi phương thức tĩnh. Một cách tiếp cận hoàn toàn khác có lẽ sẽ là cần thiết. – AaronLS

+0

yo thx rất nhiều, đọc qua công cụ atm và cố gắng tìm nút "tải xuống nguồn" trên Moq :). thx cho đến nay, sẽ quay lại sau – bas

1

Hầu như tất cả các khung công tác mô phỏng .NET tận dụng chức năng Castle Windsor's Dynamic Proxy. Tôi sẽ khuyên bạn nên đi qua một số trong đó.

4

Hầu hết khung công tác mô phỏng nguồn mở sử dụng Castle Windsor's Dynamic Proxy để tự động tạo kiểu khi chạy, có thể được lập trình với hành vi mong đợi. Đây là lý do tại sao hầu hết các khung công tác đó yêu cầu phải có một giao diện hoặc một lớp trừu tượng - chúng không thể giả lập bất cứ thứ gì không phải là một phương thức ảo.

Có tồn tại các khuôn khổ mocking (thương mại) khác thực sự có thể giả lập các lớp tĩnh và thường (kín), bao gồm các loại CLR, dựa trên không được quản lý CLR Profiler API. Về cơ bản, khuôn khổ mocking hoạt động như một profiler, và có thể sửa đổi các lệnh MSIL trong bộ nhớ ngay trước khi biên dịch JIT. Đây là cách nó có thể thay thế cơ thể của bất kỳ phương pháp nào với các giá trị được xác định trước. Một số khung công tác đó là miễn phí * (Microsoft Fakes, một phần của Visual Studio 2012 Ultimate), một số khác là các sản phẩm trả tiền, chẳng hạn như Typemock.

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