【问题标题】:How do I get a Unit Test to copy my DLLs and other files when I run a test?当我运行测试时,如何让单元测试复制我的 DLL 和其他文件?
【发布时间】:2011-12-09 10:09:35
【问题描述】:

我正在开发一个应用程序,并为它创建了许多单元测试。具有测试类的项目依赖于 3 个第三方 DLL。当我转到测试项目的 bin\Debug 文件夹时,Dll 就在那里。但是当我运行测试时,DLL 不会被复制到 TestResult\\Out 文件夹中。

还有一个我想复制的另一个项目的 log4net.config 文件。这个没有出现在测试项目的 bin\Debug 文件夹中,所以这是我必须解决的另一个问题。

我如何在运行单元测试时复制这些文件?

托尼

【问题讨论】:

标签: c# unit-testing mstest


【解决方案1】:

我发现如果您的测试正在部署到测试区域(默认为 true),则本地复制在某些情况下(例如动态程序集加载)将不起作用。

您可以使用运行设置文件 (https://msdn.microsoft.com/en-us/library/ms182475.aspx) 关闭此部署,也可以

<DeploymentEnabled>False</DeploymentEnabled>

或者,一个小技巧(有点难看,因为它需要手动/硬编码程序集),通过对二进制文件使用 DeploymentItem(在其他答案中提到,但不特定于根据 OP 处理 dll):

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]

建议同时进行调试/发布,具体取决于您的 CI/Dev 上使用的内容。

【讨论】:

    【解决方案2】:

    从工作室调试时,使用类或测试方法上的部署属性将所需的 DLL 和配置文件复制到运行 MSTest 的 Out 文件夹。如果从命令行运行,请使用 TestSettings 文件并禁用部署选项并将 BIN 文件夹设置为工作目录。在命令行中使用/引用此 TestSettings 文件以运行 mstest。这样,您可以直接在 BIN 文件夹中运行 mstest,而无需将 DLL 转储到 out 目录中。同样,使用部署属性从工作室调试,测试设置将不起作用。

    【讨论】:

      【解决方案3】:

      您可以使用 DeploymentItemAttribute 将文件复制到 bin(或其他)目录。

      [TestMethod()]
      [DeploymentItem("log4net.config")]
      public void SomeTest()
      {
         ...
      }
      

      【讨论】:

      • 我早上回去工作时会试试看。看起来很有希望!
      【解决方案4】:

      这样的 dll 复制(除了引用它们 - 你可以说 Copy Local)并将它们放在 out 文件夹中不应该是你的测试的一部分,而是你的构建/打包过程的一部分。拥有执行必要的 dll 复制的构建脚本。

      【讨论】:

      • 引用了 DLL,但没有复制它们。这是因为这些 DLL 的 Copy Local 属性是错误的。它们不是测试过程的一部分,除非它们被代码使用。
      【解决方案5】:

      我们有一个 bin 文件夹,其中包含必须是构建的一部分的第 3 方 DLL。它们在参考中使用“复制本地”属性进行标记。

      对于单个文件,您可以这样做 - 将“复制到输出目录”设置为 true。

      【讨论】:

      • 谢谢!这修复了 DLL。我不太明白如何解决 log4net.config 文件的问题。那个在另一个项目中,并且它的“复制到输出目录”属性设置为“如果更新则复制”(我使用的是 VS 2010)。但它不会被复制到测试项目的 bin\Debug 文件夹中,并且测试依赖于该项目。
      猜你喜欢
      • 2014-02-17
      • 2013-01-07
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      相关资源
      最近更新 更多