unit-testing - 使用 NUnit 进行 MEF 和单元测试

标签 unit-testing mef system.componentmodel

几周前,我加入了 MEF (ComponentModel) 潮流,现在我将它用于我的许多插件和共享库。总的来说,除了我经常犯的错误,这导致调试 session 令人沮丧之外,这一切都很好。

无论如何,我的应用程序运行良好,但与 MEF 相关的代码更改导致我的自动构建失败。我的大多数单元测试都失败了,仅仅是因为我正在测试的模块依赖于需要由 MEF 加载的其他模块。我通过绕过 MEF 并直接实例化这些对象来解决这些情况。

换句话说,通过 MEF 我会有类似的东西

[Import]
public ICandyInterface ci { get; set; }


[Export(typeof(ICandyInterface))]
public class MyCandy : ICandyInterface
{
    [ImportingConstructor]
    public MyCandy( [Import("name_param")] string name) {}
    ...
}

但在我的单元测试中,我只会使用
CandyInterface MyCandy = new CandyInterface( "Godiva");

此外,CandyInterface 需要连接到数据库,我通过将测试数据库添加到我的单元测试文件夹来解决这个问题,并且我让 NUnit 将它用于所有测试。

好的,所以这是我关于这种情况的问题:
  • 这是做事的坏方法吗?
  • 你会推荐在 [SetUp]
  • 中组成部分吗?
  • 我还没有学会如何在单元测试中使用模拟——这是我可能想模拟底层数据库连接(以某种方式)只返回虚拟数据而不真的需要数据库的一个很好的例子吗?
  • 如果你以前遇到过这样的事情,你能提供你的经验和你解决问题的方法吗? (或者这应该进入社区维基?)
  • 最佳答案

    听起来你在正确的轨道上。单元测试应该测试 单位 ,这就是你直接创建实例时所做的。如果您让 MEF 为您编写实例,它们将倾向于 集成测试 .并不是说集成测试有什么问题,而是单元测试往往更易于维护,因为您单独测试每个单元。

    You don't need a container to wire up instances in unit tests .

    我通常建议不要在 SetUp 中编写 Fixtures,因为它会导致 General Fixture反模式。

    最好用 Test Doubles 替换依赖关系.动态模拟是执行此操作的更通用的方法之一,因此绝对是您应该学习的东西。

    关于unit-testing - 使用 NUnit 进行 MEF 和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2851140/

    相关文章:

    c# - 如果我不使用 IoC 容器,是否有比单例模式更好的选择来公开我的类的依赖项?

    java - Spock rightShift( mock )运算符显然不起作用

    Python unittest正确设置全局变量

    c# - 如何在运行时使用 Ninject 的 DI 动态添加新绑定(bind)?

    c# - MEF错误 "Only one batch can be composed at a time"

    c# - 在不引用 Windows Workflow Foundation 中的设计 DLL 的情况下创建自定义事件设计

    compact-framework - 如何在 Compact Framework 上处置 Forms.Timer

    c++ - 为客户端/服务器程序编写单元测试

    c# - 使用 MEF 在 Prism 中查看初始化时出现问题

    c# - 如何首先使用实体​​框架代码指定字段的最大列长度