MEF 和使用 NUnit 进行单元测试

2024-03-06

几周前,我加入了 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 将其用于所有测试。

好的,这是我关于这种情况的问题:

  1. 这是一种糟糕的做事方式吗?
  2. 您建议在[SetUp]中组合零件吗?
  3. 我还没有学会如何在单元测试中使用模拟——这是一个很好的例子,我可能想模拟底层数据库连接(以某种方式)只返回虚拟数据,而不是真正需要数据库?
  4. 如果您以前遇到过类似的情况,您能提供一下您的经验以及解决问题的方法吗? (或者这应该进入社区维基?)

听起来你走在正确的轨道上。单元测试应该测试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(使用前将#替换为@)

MEF 和使用 NUnit 进行单元测试 的相关文章

随机推荐

  • MongoDB - 安装错误 - mongodb 安装向导提前结束

    我之前安装的时候也遇到过这个问题 也检查了其他线程 但在我的情况下无法找到正确的解决方案 UPDATE CLOSED 取消选中Install MongoDB Compass设置向导中的选项 为我工作
  • Android TextView:设置文本时获取“W/StaticLayout:maxLineHeight 不应为-1。maxLines:1 lineCount:1”

    我根据计时器每 0 5 秒在 TextView 上设置一些文本 每次 当计时器运行并设置文本时 我都会在控制台中收到此警告消息 W StaticLayout maxLineHeight 不应为 1 最大行数 1 行数 1 XML代码
  • python 闭包 + oop

    我正在尝试用 python 闭包做一些有点奇怪的事情 至少对我来说 假设我有两个这样的课程 usr bin python import types def method a self print ma d self val class A
  • 将 YAML 文件转换为 Application.properties [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们如何将 YAML 文件转换为应用程序属性 pay payment sandbox Url https securegw stage p
  • jquery keypress() 事件获取文本

    我希望在文本框上按下按键时运行一个函数 所以我有以下代码 input x keypress function DoX 这工作正常 但在我的函数中我想根据文本框中的文本值做一些事情 var textValue input x val 现在的问
  • java.util.AbstractList.remove 处的 java.lang.UnsupportedOperationException(来源未知)

    我试过下面的代码 String s 1 2 3 4 Collection c Arrays asList s System out println c remove 1 remove flag System out println coll
  • 熊猫标签重复

    给定以下数据框 import pandas as pd d pd DataFrame label 1 2 2 2 3 4 4 values 3 5 7 2 5 8 3 d label values 0 1 3 1 2 5 2 2 7 3 2
  • 批量处理长 Linq 操作?

    我提出了一个问题并得到了回答here https stackoverflow com a 23606749 859154关于我遇到的性能问题large数据收集 使用 linq 创建 好吧 我们先把它放在一边 但其中一个有趣的 并且geniu
  • GXT (Ext-GWT):ContentPanel 的布局问题

    我有一个适合整个窗口的内容面板 它有一个顶部组件 一个位于中心的小部件和一个底部组件 当我尝试在 ContentPanel 渲染一次后将小部件添加到 topComponent 时 我遇到了布局问题 public void onModuleL
  • 无法在 Windows 8 上的 WAMP 上运行 PHP CLI

    我已经尝试这个好几个小时了 我收到以下错误 php is not recognized as an internal or external command operable program or batch file 我已完成的步骤 1
  • 如何从 Python 脚本中触发气流 DAG 运行?

    使用 apache airflow 我创建了一些 DAGS 其中一些不按计划运行 我正在尝试找到一种方法 可以从 Python 脚本中触发特定 DAG 的运行 这可能吗 我能怎么做 编辑 python 脚本将从与我所有 DAGS 所在的项目
  • Android 5,camera2仅使用闪光灯

    我只需要使用带有APIcamera2 Android 5 API级别21 的闪光灯 就像手电筒应用程序一样 但我发现的所有示例都需要在视图中显示相机流 https github com pinguo yuyidong Camera2 blo
  • VBA本地时区调整

    假设我有一个本地太平洋时间 UTC 8 Excel 值 例如41656 67297 is 17 January 2014 4 09 PM 我无法控制这个值 我想相对于用户当地时间调整给定值 例如 都柏林的某人正在使用 Excel 工作簿 我
  • Apache Pig:无法运行我自己的pig.jar 和pig-withouthadoop.jar

    我有一个运行 Hadoop 0 20 2 和 Pig 0 10 的集群 我有兴趣向 Pig 的源代码添加一些日志 并在集群上运行我自己的 Pig 版本 我做了什么 使用 ant 命令构建项目 有pig jar和pig without had
  • 如何在自定义启动器上安装图标包?

    我正在尝试在自定义启动器上安装图标包 我已阅读此说明如何安装图标包 https stackoverflow com questions 31490630 how to load icon from icon pack但我无法理解如何使用该类
  • 使用片段的 Ecto“left IN right”查询

    我想使用 postgres IN 运算符 使用 Ecto 库 查询 jsonb 字段 此代码使用简单的 运算符 from a in query where fragment gt gt format a properties foo 但我无
  • Vagrant:192.168.33.10 拒绝连接

    你好 我通过vagrant在虚拟机中安装了centOS6 还安装了httpd和php 但是 当我尝试访问http 192 168 33 10 http 192 168 33 10这是我在Vagrantfile中设置的IP地址 我无法打开网页
  • “附加到流程”作为构建后事件

    我有一个在 w3wp exe 进程下托管的应用程序 在调试时 我经常发现自己遵循以下步骤 1 做一些改变 2 构建项目 3 使用 工具 菜单下的 附加到进程 对话框附加到 w3wp exe 4 在应用程序中执行一些操作以使我的代码执行 这样
  • 有没有办法在Asp.net core中执行批量请求?

    我们有一个使用 ASP Net Core 构建的 API 出于性能原因 我们希望将多个请求合并为一个 HTTP 请求 在以前版本的 ASP NET 中 您可以通过以下方式允许批量请求默认HttpBatchHandler https www
  • MEF 和使用 NUnit 进行单元测试

    几周前 我加入了 MEF 组件模型 潮流 现在将它用于我的许多插件和共享库 总的来说 除了我经常犯的错误 导致调试过程令人沮丧 之外 它还是很棒的 无论如何 我的应用程序运行得很好 但我的 MEF 相关代码更改导致我的自动构建失败 我的大多