2012-09-18 17 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

好又容易! –