代码之家  ›  专栏  ›  技术社区  ›  Dave D

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

  •  2
  • Dave D  · 技术社区  · 15 年前

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

    [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 目录,只要我只有一个测试程序集加载到解决方案中,或者这是我运行测试的唯一程序集(即仅在当前上下文/类中运行测试)。

    只要添加第二个程序集并运行解决方案中的所有测试,该目录就不会再被复制, 但是 任何其他仅仅是单个文件的部署似乎都会得到很好的复制。

    测试本身仍然在运行,但是依赖于该目录崩溃的测试。这可能是因为MSTEST找不到目录——也许它希望它位于其他测试程序集之一的构建目录中?

    有没有什么想法,多个测试项目会阻止复制,我能做些什么来绕过它,除了把目录中的每个文件都作为一个单独的部署添加?

    2 回复  |  直到 13 年前
        1
  •  1
  •   chaliasos    13 年前

    这个问题由来已久,但仍可能有益于其他人。尤其是自 结束于此:)

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

    但是,目标文件夹名称可以不同,不会产生不良影响。

    我的建议是:

    1. 创建fixture基类(如果愿意,在单独的项目中)
    2. 添加属性: [TestClass, DeploymentItem("LanguageData", "LanguageData")]
    3. 改变你 OcrTests OcrBuilderTests 类来继承新类。
    4. 请记住,从OCRtests和OCRBuildertests中删除“LanguageData”的DeploymentItem属性。

    我试过了,非常成功。 在我的例子中,我有一个公共的测试夹具项目和多个测试项目,每个项目都使用基类。

    不幸的是,DeploymentMatttribute中充满了gotchas,请参见 here 更多。

        2
  •  0
  •   Gatis BergÅ¡pics    13 年前

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

    [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
    {
    }