1

我正在尝试使用 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:在模拟类型上找不到给定参数的匹配构造函数。---> System.MissingMethodException:找不到类型“AbcProxya759aacd0ed049f3849aaa75e2a7bade”的构造函数。

4

2 回答 2

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 只支持模拟无参数类,事实并非如此。

于 2010-08-19T12:10:21.970 回答
2

这有点像一开始就理解 DI:- 小样本并不能真正理解重点。

像 Ninject.Moq 这样的自动模拟容器(或类似的测试基础设施库像AutoFixture)很难用一个简单的例子来真正解释。我建议阅读Mark Seemann 在 AutoFixture 上的所有帖子,以了解需求。

因此,Ninject.Moq 将处理在执行您的测试实际上应该测试的事情的过程中满足您的被测系统所必需的一组接口的存根实现的链接、 N 级深度。

通常,您希望简短易读、易于理解的测试具有最小的复杂性和底层固定装置的交互(没有大的基类层次结构,或 6 种不同的魔术方法进行古怪的拆卸和调用基类)。通常这个目标意味着你应该让你的 DI 工具远离你的单元测试。

自动模拟容器应该像电锯一样,仅用于您将获得可观的实际回报(许多更短,更容易理解的测试)为您的投资(另一个在其他人可以阅读您的测试之前理解的工具,更多调试,更多的惊喜、更多的复杂性会导致脆弱、无法维护的测试)。

于 2010-08-16T08:51:29.773 回答