XML文件未复制到测试输出目录

43

使用内置的Web服务器在Visual Studio 2010上的x64机器上托管WCF服务,并使用内置测试框架运行一组单元测试。

我有一个XML文件,我的测试需要加载以运行。 我已将该文件包含在测试项目中,并将文件设置为“内容”和“始终复制到输出目录”。 这个文件可以成功地复制到bin \ debug目录中。

然而,当我执行测试时,xml文件并不在那里。 它不是在项目的bin \ debug文件夹中查找,而是在测试的工作目录C:\ Projects \ SAP Reapprovals \ TestResults \ name_machine 2010-12-06 13_45_43 \ Out中查找。 文件还没有被复制到那里。

有没有办法强制复制这个文件,或者我需要从测试内部完全引用该文件?

TIA!
James


更新
我设置了DeploymentItem属性,但该文件仍未复制。 但那看起来就像我想要的...有什么想法为什么它不起作用?

我的测试代码:

[TestMethod]
[DeploymentItem("SAP - GS3 format.xml")]
public void TestProcessSapRoles() {

    //  I get a 'file not found' error here, and when 
    //  I check the output directory, it isn't there
    XElement rolesRoot = XElement.Load("SAP - GS3 format.xml");

}


答案:
感谢CPedros的帮助,让我能更加深入地了解这个问题。我使用SysInternals的Process Monitor来查看它在哪里寻找我的xml文件。以下是我的发现:

当我使用ctrl+r,ctrl+t(在当前上下文中调试测试)运行测试时,Visual Studio完全忽略了DeploymentItem属性,并且甚至没有尝试将文件复制到任何位置。在这种情况下,当我尝试打开它进行读取时,我会得到“文件未找到”的异常。Visual Studio为测试创建了一个临时工作目录,但其中只有一个文件AgentRestart.dat。

当我使用工具栏中的“运行单元测试”按钮(不确定是哪个测试选项)运行测试时,Visual Studio没有复制文件,而是直接从项目目录引用它。测试通过,没有创建临时工作目录。

当我从菜单选项“运行 -> 在当前上下文中运行测试”(运行,而不是调试)运行测试时,将创建一个临时工作目录,并将xml文件和所有可执行文件复制到其中。测试通过。

当我编辑Local.testsettings(在我的测试文件夹下的Solution Items文件夹下),我选择左侧菜单中的“Deployment”,并添加了xml文件。它被添加为[solution directory]\[project directory]\file.xml。我删除了DeploymentItem属性。现在我可以调试测试了;xml文件和所有可执行文件都被复制到为测试创建的临时目录中。

简而言之:Visual Studio会忽略某些运行测试的方式中的DeploymentItem属性。解决方案是编辑Local.testsettings,进入Deployment菜单,并手动添加文件。

感谢帮助!我将给予CPedros答案的荣誉,因为他的回答对于解决这个问题最有帮助。


3
太棒了,你简直是个明星!!如果可以的话,我会给你更多的赞…… - MalcomTucker
1
运行单元测试对我很有帮助。好问题。谢谢。 - Gaʀʀʏ
1
@James B 最近从.NET 2.0升级到.NET 4.5,使用Visual Studio 2012 Express版面对这一切。只是想表明SO确实是一个有用的长期信息库。你的更新真的帮助我掌握了这个问题。 - DavidHyogo
很高兴能帮忙 :) 试图回忆在互联网出现之前我们是如何解决问题的...毫无头绪。 - James King
4个回答

22

尝试使用DeploymentItem属性对您的测试进行注释:http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=VS.100).aspx

这是文档中的代码片段:

  [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.txt")]
        public void ConstructorTest()
        {
            // Create the file to deploy
            Car.CarInfo();
            string file = "testFile1.txt";
            // Check if the created file exists in the deployment directory
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }

我更新了我的问题...基本上,看起来你说的是我想要的,但出于某种原因它仍然没有复制。有任何想法为什么会这样? - James King
2
@James B. 符号“DeploymentItem("file.txt")”依赖于在.testrunconfig中定义的RelativePathRoot处可用的文件。这可能不是您的测试项目位置,如果是这种情况,则您可能需要使用“DeploymentItem("YourTestProject\file.txt")”。 - Pero P.
请查看以下链接以获取详细信息:http://msdn.microsoft.com/zh-cn/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=VS.100).aspx - Pero P.
我已经读了那篇文章好几遍,它很有帮助,但是比较通用。不过,它确实说:“相对路径是相对于项目路径的。”这对我来说意味着,如果我要复制的文件在主项目文件夹中,它应该会被复制过来。我试过“MyTestProject\file.txt”,但也没能成功。在我的解决方案或项目文件夹中都找不到.testrunconfig 文件... 我有两个 .testsettings 和一个 .vsmdi。.testsettings 里有一些有前途的条目,下一步我将尝试它们。但我希望能找到一种方法来查看它正在尝试从哪个文件夹复制此文件出去。 - James King
1
需要注意的是,DeploymentItem属性具有[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = true)],这意味着它可以应用于整个TestClass,以便您不必将其应用于每个TestMethod。 - Ian Pugsley
显示剩余2条评论

0

我已经纠结在deploymentattribute上很长一段时间了,最后终于放弃了。相反,我现在只是手动将文件复制到一个测试目录中,完成后再删除它们:

测试文件位置:

Private _locationOfTestFilesToBeCopied As String = "C:\...\TestFilesToBeCopied"
Private _locationOfTestFiles As String = "C:\...\TestFiles"

初始化方法:

<TestInitialize()>
Public Sub Setup()
    DeleteCopiedTestFiles()
    CopyTestFilesToTestDirectory()
End Sub

复制和删除方法:

Private Sub CopyTestFilesToTestDirectory()
    Dim sourceDirectory As New DirectoryInfo(_locationOfTestFilesToBeCopied)

    For Each fileInfo As FileInfo In sourceDirectory.GetFiles
        fileInfo.CopyTo(_locationOfTestFiles & "\" & fileInfo.Name, True)
    Next

    sourceDirectory = Nothing
End Sub

Private Sub DeleteCopiedTestFiles()
    Dim sourceDirectory As New DirectoryInfo(_locationOfTestFiles)

    For Each fileInfo As FileInfo In sourceDirectory.GetFiles
        fileInfo.Delete()
    Next

    sourceDirectory = Nothing
End Sub

我发现这个很有效



0

我遇到了一个问题,即使我已在local.testSettings中输入了文件名并设置了属性为“始终复制”,但其中一个文件仍未复制到out文件夹中。

以下步骤解决了我的问题:

  1. 打开测试菜单
  2. 选择测试设置
  3. 选择“选择测试设置文件”选项
  4. 从“打开设置文件”窗口中选择您的.testsettings文件
  5. 确保所选的.testsettings文件在“测试 -> 测试设置”下被勾选

希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接