2012-05-15 83 views
0

NSubstitute說,這在其docs有沒有辦法讓一個類返回值遞歸嘲笑與NSubstitute

方法,返回的接口[...]會自動返回替代自己。

通常這就夠了。然而,當我這樣做:

TestMethod的:

IUnityContainer unity = Substitute.For<IUnityContainer>(); 
MyMethod(unity); 

實際方法:

public void MyMethod(IUnityContainer container) 
    { 
     this.container = container; 

     myObject = container.Resolve<ISomeObject>(); 

     myObject.CallSomeMethod(); 
    } 

Resolve方法返回一個類。所以它沒有被嘲笑。這意味着當我調用CallSomeMethod時,我在myObject中獲得null值,並且返回空引用異常;

這將是很好,如果我可以得到一個類返回是一個模擬(這是除非我已經重寫了該接口具體)。

有什麼辦法可以得到這個使用NSubstitute

+0

不會'IUnityContainer.Resolve '返回'T'?所以如果'T'是一個接口'ISomeObject',NSubstitute應該返回一個模擬的'ISomeObject',如果你調用'container.Resolve ()'。它沒有這樣做? –

回答

2

如果ISomeObject是一個接口,這應該工作正常。如果你想獲得自動替換類,這個類需要有一個默認的構造函數,並且所有的公共成員被聲明爲虛擬的。

下測試通過對我來說:

public interface IFactory { T Resolve<T>(); } 
public interface ISomeObject { void CallSomeMethod(); } 

public class Tests 
{ 
    [Test] 
    public void Example() 
    { 
     var factory = Substitute.For<IFactory>(); 
     MyMethod(factory); 
    } 
    public void MyMethod(IFactory container) 
    { 
     var myObject = container.Resolve<ISomeObject>(); 
     myObject.CallSomeMethod(); 
    } 
} 
+3

原來IUnityContainer.Resolve ()是一個擴展方法。我猜測NSubstitute沒有做任何擴展方法... – Vaccano

+1

啊,很好地發現。是的,NSub不會攔截ext/static方法。我建議不要將此答案標記爲正確,因爲真正的答案是您找到的答案:它不適用於靜態/擴展方法。 –

相關問題