2012-09-18 65 views
-1

我有一個調用靜態類的類,靜態類主要是另一個類的包裝。我知道我不能模擬/ ioc靜態類,但可以爲非靜態類做到這一點?下面如何在靜態類中模擬/ ioc類?

是我的代碼結構的樣本

namespace lib.CanModify 
{ 
    public class Something 
    { 
     public void method() 
     { 
      var obj = lib.CanNotModify.StaticClass.DoSomething(); 


     } 
    } 

} 
namespace lib.CanNotModify 
{ 
    public static class StaticClass 
    { 
     public static Node DoSomething() 
     { 
      /*The class i want to mock!*/ 
      Node node = new Node(10); 
      return node; 

     } 
    } 
} 

請諮詢的方式來嘲笑通過MSTEST

+0

您可以從您的靜態類改爲非靜態?否則,你不能模擬,如果節點是字段,不是本地參數,你可以模擬 –

+0

該方法看起來純粹我。國際海事組織你不應該嘲笑副作用免費代碼。 – CodesInChaos

回答

2

節點類簡單的答案是否定的!

你不能嘲笑類的具體實現。你只能創建類的實例,你只能模擬接口或基類。通過使用繼承來實現接口或基類的屬性,模擬假裝成爲具體類。基本上創造了一個新的飛行課程的具體實例。

如果你改變你的結構:

public class Node() : INode 

然後,你可以嘲笑這樣的:

var moqNode = new Mock<INode>(); 

(這是BTW起訂量語法)

那麼你就需要改變你的變量爲INode

INode node = new Node(10); 

,然後你居然還需要注入你的扶養:

public static Node DoSomething(INode node) 
     { 

      return node; 

     } 

這將使整個事情是一場鬧劇......?!

2

您可以創建一個StaticClassWrapper和一個接口IStaticClass,然後將IStaticClass注入您的方法。

然後你就可以輕鬆地嘲笑IStaticClass

namespace lib.CanModify 
{ 
    using lib.CanNotModify; 

    public class Something 
    { 
     public void method() 
     { 
      method(new StaticClassWrapper()); 
     } 

     public void method(IStaticClass staticClass) 
     { 
      var obj = staticClass.DoSomething(); 
     } 
    } 

    public interface IStaticClass 
    { 
     Node DoSomething(); 
    } 

    public class StaticClassWrapper : IStaticClass 
    { 
     public Node DoSomething() 
     { 
      return lib.CanNotModify.StaticClass.DoSomething(); 
     } 
    } 

} 

這類似於ASP.NET MVC項目如何製造類,如System.Web.HttpRequest mockable

+0

好又容易! –