几周前,我加入了MEF(ComponentModel)的行列,现在正在将其用于我的许多插件和共享库。总体来说,它很棒,但是由于我经常犯错误,导致令人沮丧的调试会话,这是唯一的缺点。
无论如何,我的应用程序运行得很好,但是与MEF相关的代码更改导致我的自动构建失败。我的大多数单元测试都失败了,因为我正在测试的模块依赖于需要由MEF加载的其他模块。我通过绕过MEF直接实例化那些对象来解决这些情况。
换句话说,通过MEF,我会有类似以下的内容:
并且。
此外,CandyInterface需要连接到数据库,我通过向单元测试文件夹添加一个测试数据库并让NUnit在所有测试中使用它来解决了这个问题。
好的,以下是我的问题:
1. 这样做是不是一种不好的方式? 2. 您是否建议在[SetUp]中组合部件? 3. 我还没有学习如何在单元测试中使用模拟 -- 这是一个很好的例子,我应该模拟底层数据库连接(某种方式)以返回虚拟数据而不是真正需要一个数据库吗? 4. 如果您以前遇到过类似的情况,您能否分享您的经验和解决问题的方法?(或者是否应将此放入社区wiki中?)
无论如何,我的应用程序运行得很好,但是与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在所有测试中使用它来解决了这个问题。
好的,以下是我的问题:
1. 这样做是不是一种不好的方式? 2. 您是否建议在[SetUp]中组合部件? 3. 我还没有学习如何在单元测试中使用模拟 -- 这是一个很好的例子,我应该模拟底层数据库连接(某种方式)以返回虚拟数据而不是真正需要一个数据库吗? 4. 如果您以前遇到过类似的情况,您能否分享您的经验和解决问题的方法?(或者是否应将此放入社区wiki中?)