使用IoC时单元测试的策略应该是什么?

2023-12-29

在读完有关依赖注入和 IoC 的所有内容后,我决定尝试在我们的应用程序中使用 Windsor Container(它是一个 50K LOC 多层 Web 应用程序,所以我希望它不是一个矫枉过正的东西)。我使用了一个简单的静态类来包装容器,并在启动应用程序时初始化它,目前效果很好。

我的问题是关于单元测试的。我知道 DI 将使我的生活变得更加轻松,因为我可以将类协作者的存根/模拟实现注入到被测试的类中。我已经使用这种技术编写了几个测试,这对我来说似乎很有意义。我不确定的是我是否应该在单元测试中使用 IoC(在本例中为 Windsor Castle)(可能以某种方式将其配置为针对我的特殊情况返回存根/模拟),还是最好连接所有依赖项在测试中手动进行。您认为什么以及哪些实践对您有效?


在单元测试中不需要 DI 容器,因为依赖项是通过框架生成的模拟对象提供的,例如犀牛模拟 http://www.ayende.com/projects/rhino-mocks.aspx or Moq http://code.google.com/p/moq/。因此,例如,当您测试一个依赖于某个接口的类时,这种依赖关系通常是通过构造函数注入提供的。

public class SomeClassToTest
{
    private readonly ISomeDependentObject _dep;
    public SomeClassToTest(ISomeDependentObject dep)
    {
        _dep = dep;
    }

    public int SomeMethodToTest()
    {
        return _dep.Method1() + _dep.Method2();
    }
}

在您的应用程序中,您将使用 DI 框架来传递一些实际的实现ISomeDependentObject在构造函数中,它本身可能依赖于其他对象,而在单元测试中,您创建一个模拟对象,因为您只想单独测试此类。 Rhino Mocks 示例:

[TestMethod]
public void SomeClassToTest_SomeMethodToTest()
{
    // arrange
    var depStub = MockRepository.CreateStub<ISomeDependentObject>();
    var sut = new SomeClassToTest(depStub);
    depStub.Stub(x => x.Method1()).Return(1);
    depStub.Stub(x => x.Method2()).Return(2);

    // act
    var actual = sut.SomeMethodToTest();

    // assert
    Assert.AreEqual(3, actual);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用IoC时单元测试的策略应该是什么? 的相关文章

  • “跳过 Surefire 的执行,因为它已经为此配置运行过”?

    请原谅这个新问题 我的概念模型仍然很不完整 我正在尝试使用 Maven 和 Surefire 从命令行重新执行 TestNG 测试 我的命令行如下所示 D workspaces workspace01 aptest gt mvn clean
  • 如何清除隐藏上的引导模式

    如何在关闭 隐藏 关闭时清除引导模式 我有以下模态定义
  • asio::this_coro::executor 的实现是什么

    在协程函数中 我们可以添加auto ex co await asio this coro executor 获取该协程的执行者 但当我想了解它的定义时 我发现了这个 Awaitable type that returns the execu
  • PostgreSQL 位图堆扫描索引非常慢,但仅索引扫描很快

    我创建了一个包含 43kk 行的表 并用值 1 200 填充它们 因此 表中每个数字大约为 220k create table foo id integer primary key val bigint insert into foo se
  • 如何为QTableView中的当前项目设置样式表

    When QTableView编辑控件对于发生编辑的当前项目可见 当窗口中没有活动的编辑控件时QTableView当前项目的样式使用QTableView selection background color 如何只为当前项目设置不同的样式
  • 如何以编程方式从 Flex 组件中删除验证

    如何以编程方式从 Flex 组件中删除验证 这是我的方法 public static function validateRequired txt TextInput errorMessage String This field is req
  • C# 中的 mshtml.HTMLDocumentClass

    在 C 中 我设法从 InternetExplorer 对象获取整个 HTMLDocumentClass 导航到某个 URL 然而 在 Visual Studio 2008 的调试模式下 该特定 URL 的 HTMLDocumentClas
  • issubclass() 对从不同路径导入的同一类返回 False

    目的是实现某种插件框架 其中插件是同一基类 即 A 的子类 即 B 基类使用标准导入加载 而子类使用 imp load module 从众所周知的包 即 pkg 的路径加载 pkg init py mod1 py class A mod2
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • Laravel 使用 laravel-cors 和 axios 进行 POST 的“CSRF 令牌不匹配”

    我有一个正在运行的domain A拉拉维尔 5 8返回 API 的引擎网络路线 它必须检查来源才能只服务几个域 包括domain B Barryvdh laravel cors我安装了barryvdh laravel cors https
  • 在Python中从日期时间中减去秒

    我有一个 int 变量 它实际上是秒 让我们调用这个秒数X 我需要得到当前日期和时间 以日期时间格式 减去的结果X秒 Example If X是 65 当前日期是2014 06 03 15 45 00 那么我需要得到结果2014 06 03
  • 在数据库准备好之前运行 Jest 测试

    我正在使用 Jest 来测试我的带有 SQLite 数据库的 Express API 但是出现了以下问题 测试在数据库准备好并创建表之前运行 我使用以下代码连接到数据库 const connectToDatabase gt let db i
  • GitLab Runner 重启后不会自动拾取作业

    所以我们的 GitLab Runner 已经正常运行了几周了 我必须进行一些升级 需要在安装它的计算机上重新启动 重新启动后 它不再自动拾取作业 我所有的管道都说它们被卡住了 因为没有跑步者可以接替工作 我通过 SSH 连接到机器并运行 s
  • RecyclerView元素更新+异步网络调用

    我有一个按预期工作的回收视图 我的布局中有一个按钮可以填充列表 该按钮应该进行异步调用 根据结果 我更改按钮的外观 这一切都发生得很好 但是 当我单击按钮并快速向下滚动列表时 异步调用的结果会更新新视图的按钮 代替旧视图的视图 我该如何处理
  • 在游戏中实现功能

    我在完成这部分作业时遇到了麻烦 我必须宣布游戏的获胜者 然后输入到函数中 输入所有 if 语句后 我必须创建一个函数def playGame 这必须包括 showRules user getUserChoice computer getCo
  • 无法在 mongodb 中创建角色

    我正在尝试在 mongodb 中创建一个新角色 但它给了我错误 gt use Admin switched to db Admin gt db createRole role executeFunctions privileges reso
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 如何在ExtJs商店中使用过滤器?

    我使用 ExtJs 创建了一个商店 我想将商店的值加载到 ComboBox 但在加载值之前 我需要根据另一个组合框中选择的值过滤一些数据 因此 为了这个目的 我认为我需要在商店应用过滤器 请任何人都可以帮助我如何做到这一点 Model Ex
  • 测试 NSMutableArray 是否包含字符串对象

    我有一个NSMutableArray其中包含一些NSString对象 如何测试数组是否包含特定的字符串文字 I tried array containsObject teststring 但这行不通 你所做的应该很好 例如 NSArray
  • 为什么 Perl 6 的 try 不处理 shell() 中的非零退出?

    This try https docs raku org language exceptions index entry try blocks try捕获异常 try die X AdHoc say Got to the end 输出显示程

随机推荐