-1

我有一个调用静态类的类,静态类基本上是另一个类的包装器。我知道我不能模拟/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 模拟节点类的方法

4

2 回答 2

2

最简洁的答案是不!

你不能模拟类的具体实现。您只能创建类的实例,只能模拟接口或基类。模拟通过使用继承实现接口或基类的属性来伪装成具体类。基本上是动态创建类的一个新的具体实例。

如果您将结构更改为:

public class Node() : INode

然后你可以嘲笑这个:

var moqNode = new Mock<INode>();

(顺便说一句,这是最小起订量语法)

然后,您需要将变量更改为类型INode

INode node = new Node(10);

然后你实际上还需要注入你的依赖:

public static Node DoSomething(INode node)
        {

            return node;

        }

这会成为整个事情的闹剧......?!

于 2012-09-18T16:41:20.273 回答
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模拟的类

于 2012-09-18T16:50:19.313 回答