几周前,我加入了 MEF(组件模型)潮流,现在将它用于我的许多插件和共享库。总的来说,除了我经常犯的错误(导致调试过程令人沮丧)之外,它还是很棒的。
无论如何,我的应用程序运行得很好,但我的 MEF 相关代码更改导致我的自动构建失败。我的大多数单元测试都失败了,因为我正在测试的模块依赖于需要由 MEF 加载的其他模块。我通过绕过 MEF 并直接实例化这些对象来解决这些情况。
换句话说,通过 MEF 我会得到类似的东西
[Import]
public ICandyInterface ci { get; set; }
and
[Export(typeof(ICandyInterface))]
public class MyCandy : ICandyInterface
{
[ImportingConstructor]
public MyCandy( [Import("name_param")] string name) {}
...
}
但在我的单元测试中,我只会使用
CandyInterface MyCandy = new CandyInterface( "Godiva");
此外,CandyInterface 需要连接到数据库,我通过将测试数据库添加到我的单元测试文件夹中来解决这个问题,并且我让 NUnit 将其用于所有测试。
好的,这是我关于这种情况的问题:
- 这是一种糟糕的做事方式吗?
- 您建议在[SetUp]中组合零件吗?
- 我还没有学会如何在单元测试中使用模拟——这是一个很好的例子,我可能想模拟底层数据库连接(以某种方式)只返回虚拟数据,而不是真正需要数据库?
- 如果您以前遇到过类似的情况,您能提供一下您的经验以及解决问题的方法吗? (或者这应该进入社区维基?)
听起来你走在正确的轨道上。单元测试应该测试unit,这就是您直接创建实例时所做的事情。如果你让 MEF 为你编写实例,他们会倾向于集成测试。并不是说集成测试有什么问题,而是单元测试往往更易于维护,因为您单独测试每个单元。
您不需要容器来连接单元测试中的实例 https://stackoverflow.com/questions/1465849/using-ioc-for-unittesting/1465896#1465896.
我通常建议不要在 SetUp 中编写 Fixtures,因为它会导致通用夹具 http://xunitpatterns.com/Obscure%20Test.html反模式。
最佳实践是将依赖项替换为测试双打 http://xunitpatterns.com/Test%20Double.html。动态模拟是执行此操作的更通用的方法之一,因此绝对是您应该学习的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)