【问题标题】:Can a unit test project reference a different external DLL than the prod project?单元测试项目能否引用与 prod 项目不同的外部 DLL?
【发布时间】:2016-05-24 20:30:24
【问题描述】:

我有这些项目/DLL:

  • mylib project - 我正在测试的具有逻辑的项目
  • mylib_test 项目 - nunit 测试项目测试 mylib
  • otherlib.dll - mylib 使用的第 3 方 DLL
  • otherlib_mock.dll - 我想在测试时使用的 otherlib.dll 的模拟。它包含otherlib.dll 中具有相同接口的所有类型,只是它始终返回模拟数据,而不是实际执行otherlib.dll 所做的工作。

我希望mylib 在常规操作中使用otherlib.dll,但是当从mylib_test 运行单元测试时,otherlib_mock.dll 将由mylib 使用。

目前,所有类型都与otherlib.dll 在同一个命名空间中,所以如果我修改mylib 以引用otherlib_mock.dll 而不是otherlib.dll - 一切都适用于模拟类型。可以以某种方式自动执行此操作以进行测试而不是常规操作吗?

选项2是:我有otherlib_mock.dll的代码。我可以将其命名空间更改为不同于otherlib.dll,然后我可以在mylib 中引用它们。现在,我通过在命名空间之间切换来在模拟和非模拟行为之间切换。我可以将using 行放在#if#else 中,以便在常规操作中使用otherlib.dll 命名空间,在运行测试时使用otherlib_mock.dll 命名空间?

【问题讨论】:

    标签: c# .net unit-testing nunit shared-libraries


    【解决方案1】:

    这是一个通过依赖注入解决的好候选。您应该在不同的命名空间中引用这两个 dll,然后在您的测试库中,注入测试库,在生产代码中,注入真实的。

    【讨论】:

    • 我知道如何注入代码,如何注入库?
    • 理想情况下,对这个库的调用应该是根据合同编写的,这样注入就会在两个引用的库之间切换。但是如果你不想更改代码,那么我猜动态加载程序集应该可以工作。
    • 另外,这个问题已经解释了类似的情况。您可以在项目中定义自定义属性,而不是架构。 stackoverflow.com/questions/3832552/…
    • 我能够通过向mylib 添加一个解决方案配置和一个名为Test 的项目配置来实现我想要的。我现在需要在编译mylib_test 时使用它们,以便mylib 包含otherlib_mock。它不是 100% 优雅的,但它可以完成工作。谢谢
    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多