2012-01-30 23 views
7

Bir kontrolör uzantısı kullanıyorum ve ben FakeItEasy böyle (v 1.7.4) kullanarak alay etmeye çalıştı:Bir uzatma yöntemini sahte/sahte yapmak mümkün mü?

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

ama bu hatayı alıyorum:

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) 

cevap

15

Bu değil mümkün. FakeItEasy (ve Moq veya RhinoMocks gibi diğer popüler serbest çerçeveler) tarafından kullanılan proxy/intercepting kütüphaneleri, statik yöntemlerin (statik özellikler, mühürlenmiş sınıflar ve sanal olmayan örnek yöntemlerin) kesişmesine izin vermez. Ve uzatma yöntemi sadece bir tür statik yöntemdir.

Bu işlevlere sahip olan TypeMock veya JustMock'a bakabilirsiniz.

+1

Alternatif statik yöntemini sıkı mock olarak oluşturabilir ve sonra yapılandırabilir, Benler da statik yöntemlerin alaycı verir // araştırma .microsoft.com/tr-us/projects/pex/ –

+4

Bu FakeItEasy için geliyor olabilir. Ne kadar sürede, emin değilim - https://github.com/FakeItEasy/FakeItEasy/issues/90 –

3

Uzantı yöntemi ayrı bir derlemede bildirilirse, aynı ad alanı olan bir yedek derleme ile bağlantı kurabilirsiniz.

Diğer montaj türlerini de bu aksamdan da değiştirmeniz gerekir. http:

FakeItEasy yılında
+1

+1: Çok fazla değiştirmek zorunda olmadığınız sürece gerçekten ilginç bir çözüm. –

+0

@jimmy_keen Teşekkürler! Temel olarak [Legacy Code ile Etkili Bir Şekilde Çalışma] 'dan bağlantı dikişidir (http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052). – TrueWill

İlgili konular