几周前,我加入了 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 将它用于所有测试。
好的,所以这是我关于这种情况的问题:
最佳答案
听起来你在正确的轨道上。单元测试应该测试 单位 ,这就是你直接创建实例时所做的。如果您让 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/