当每个解决方案有多个测试项目时,DeploymentItem无法复制目录

时间:2010-09-15 12:59:19

标签: visual-studio-2010 .net-4.0 mstest deploymentitem

我有许多复制特定目录的测试类和方法,如下所示:

[TestClass, DeploymentItem("LanguageData", "LanguageData")]
public class OcrTests
{
    [TestMethod]
    public void Can_Capture_Field()
    {
        // some code that expects the LanguageData directory to be in the test results Out directory
    }

    // etc
}

[TestClass]
public class OcrBuilderTests
{
    [TestMethod, DeploymentItem("LanguageData", "LanguageData")]
    public void Can_Build_Specific_Ocr_Engine_Implementation()
    {
        // some more code that expects the LanguageData directory to be in the test results Out directory
    }

    // etc
}

这些测试位于单个程序集中,LangaugeData目录中的所有文件都将Copy to Output Directory设置为Copy Always

一切正常并且目录被复制到测试结果Out目录,只要我只有一个测试程序集加载到解决方案中或者是我运行测试的唯一程序集(即仅运行测试)在当前的上下文/类中。)

只要我添加第二个程序集并运行解决方案中的所有测试,那么该目录就不再被复制了,但是任何其他只是单个文件的DeploymentItem似乎都被复制了。< / p>

测试本身仍然运行,但依赖于该目录的那些崩溃。大概是因为MSTest无法找到目录 - 也许它希望它在其他一个测试程序集的构建目录中?

任何关于阻止副本的多个测试项目的想法,以及我可以做些什么来解决它,除了将该目录中的每个文件作为单独的DeploymentItem添加?

2 个答案:

答案 0 :(得分:1)

这个问题已经很老了,但仍然可以让其他人受益。特别是因为 I 在这里结束了:)

似乎DeploymentItemAttribute不支持在多个测试类中使用相同的源路径名。 注意:我说的是相同的路径名,而不是物理文件夹(想想要部署相同文件夹名称的不同测试项目)。

但目标文件夹名称可能不同,没有任何不良影响。

我的建议是:

  1. 创建一个灯具基类(如果您愿意,可以在单独的项目中)
  2. 添加属性:[TestClass, DeploymentItem("LanguageData", "LanguageData")]
  3. 更改您的OcrTestsOcrBuilderTests课程以继承新课程。
  4. 请记住从OcrTests和OcrBuilderTests中删除'LanguageData'的deploymentitem属性
  5. 我试过这个,取得了巨大的成功。 在我的例子中,我有一个通用的测试夹具项目和多个测试项目,每个都使用基类。

    不幸的是,DeploymentItemAttribute填充了Gotchas,有关详情,请参阅here

答案 1 :(得分:0)

尝试过你的方法,但它仍然没有正确复制文件夹,所以我做了而不是复制文件而不是目录(也许这有助于某人):

[TestClass]
[DeploymentItem("connectionStrings.config")]

// should be able to do this, but it does not work always, only sometimes
//[DeploymentItem("Configs", "Configs")]

// this instead should work always
[DeploymentItem("Configs\\file1.txt", "Configs")]
[DeploymentItem("Configs\\file2.txt", "Configs")]
[DeploymentItem("Configs\\file3.txt", "Configs")]
.....
[DeploymentItem("Configs\\filen.txt", "Configs")]
public class BaseTests
{
}