我有一个调用静态类的类,静态类基本上是另一个类的包装器。我知道我不能模拟/ 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 :(得分:2)
简短的回答是否定的!
您无法模拟类的具体实现。您只能创建类的实例,您只能模拟接口或基类。模拟通过使用继承实现接口或基类的属性来伪装成具体类。基本上是在运行中创建一个新的具体实例。
如果您将结构更改为:
public class Node() : INode
然后你可以嘲笑这个:
var moqNode = new Mock<INode>();
(这是moq语法btw)
然后,您需要将变量更改为键入INode
INode node = new Node(10);
然后你实际上还需要注入你的依赖性:
public static Node DoSomething(INode node)
{
return node;
}
这将成为整个事情的闹剧......?!
答案 1 :(得分: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