为什么以下用Ninject.Moq嘲笑不起作用?

时间:2010-08-15 05:47:58

标签: unit-testing ninject moq ioc-container ninject-mockingkernel

我正在尝试使用Ninject.Moq运行以下代码:

[TestMethod]
public void TestMethod1()
{
    var kernel = new MockingKernel();
    var engine = kernel.Get<ABC>();

   //as I don't need to actually use the interfaces, I don't want
   //to even have to bother about them.

    Assert.AreEqual<string>("abc", engine.ToString());
}

这是ABC类的定义:

public class ABC {
    IA a;
    IB b;

    public ABC(IA a, IB b)
    {
        this.a = board;
        this.b = war;
    }

    public override string ToString()
    {
        return "abc";
    }
}

我遇到以下异常:

  

System.ArgumentException:匹配   给定参数的构造函数   在模拟类型上找不到。 ---&GT;   system.missingMethodException而:   类型的构造函数   'AbcProxya759aacd0ed049f3849aaa75e2a7bade'   没找到。

2 个答案:

答案 0 :(得分:3)

好的,这将使代码工作:

[TestMethod]
public void TestMethod1()
{
    var kernel = new MockingKernel();
    kernel.Bind<Abc>().ToSelf();
    var engine = kernel.Get<ABC>();

   //as I don't need to actually use the interfaces, I don't want
   //to even have to bother about them.

    Assert.AreEqual<string>("abc", engine.ToString());
}

必须将Abc绑定到自身,否则它也会被模拟,而Moq只支持模拟无参数类,但实际情况并非如此。

答案 1 :(得分:2)

有点像understanding DI in the first place: - 小样本并没有真正得到整个点。

像Ninject.Moq(或像AutoFixture这样的类似测试基础架构库)这样的自动插容容器很难用一个简单的例子来解释。我建议阅读all of Mark Seemann's posts on AutoFixture,以了解需求。

所以Ninject.Moq将处理一系列接口的存根实现的链接, N级深度,这些接口是在完成测试的过程中满足您的系统测试所必需的实际上应该是测试。

一般来说,你需要简单易读,易于grok测试,最小的复杂性和封面下的灯具的交互(没有大类的基类,或6种不同的魔术方法做古怪的拆解和调用基类)。通常情况下,这个目标意味着你应该让你的DI工作距离你的单元测试数英里远。

自动锁定容器应该像电锯一样,只用于您将获得显着的实际回报(许多更短,更易于理解的测试),以便您进行投资(另一种理解工具)在其他人可以阅读你的测试,更多的调试,更多的惊喜,更复杂的事情之前,会导致脆弱的,无法维护的测试。