2012-01-30 32 views
7

Tôi đang sử dụng một phần mở rộng điều khiển, và tôi đã cố gắng để thử nó bằng cách sử FakeItEasy (v 1.7.4) như thế này:có thể giả lập/giả mạo một phương pháp mở rộng không?

A.CallTo(() => controller.RenderView(A<string>.Ignored,A<object>.Ignored,null)).Returns(""); 

nhưng tôi nhận được lỗi này:

System.NullReferenceException : Object reference not set to an instance of an object. 
at System.Object.GetType() 
at FakeItEasy.Creation.ProxyGeneratorSelector.MethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget, ref String failReason) 
at FakeItEasy.Configuration.DefaultInterceptionAsserter.AssertThatMethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget) 
at FakeItEasy.Configuration.FakeConfigurationManager.CallTo(Expression`1 callSpecification) 

Trả lời

15

Đây không phải là khả thi. Proxy/chặn các thư viện được FakeItEasy sử dụng (và các framework miễn phí phổ biến khác, như Moq hoặc RhinoMocks) không cho phép chặn các phương thức tĩnh (các thuộc tính tĩnh, các lớp được niêm phong và các phương thức cá thể không ảo). Và phương pháp mở rộng chỉ là một loại phương pháp tĩnh.

Bạn có thể xem TypeMock hoặc JustMock, có chức năng như vậy.

+1

Ngoài ra, nếu bạn muốn có một tùy chọn miễn phí, Nốt ruồi cũng cho phép chế nhạo các phương pháp tĩnh: http: // nghiên cứu .microsoft.com/vi-us/projects/pex/ –

+4

Điều này có thể đến với FakeItEasy. Làm thế nào sớm, tôi không chắc chắn - https://github.com/FakeItEasy/FakeItEasy/issues/90 –

3

Nếu phương thức mở rộng được khai báo trong một hội đồng riêng biệt, bạn có thể liên kết trong một hội đồng thay thế với cùng một không gian tên.

Bạn cũng sẽ phải thay thế bất kỳ loại bắt buộc nào khác từ hội đồng này.

+1

+1: đó là giải pháp thực sự thú vị miễn là bạn không phải thay thế quá nhiều. –

+0

@jimmy_keen Cảm ơn! Về cơ bản nó là đường nối liên kết từ [Làm việc hiệu quả với Bộ luật kế thừa] (http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052). – TrueWill

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