DeploymentItem属性的问题

Jur*_*uri 94 c# unit-testing mstest visual-studio deploymentitem

我目前正在维护一个用C#.net编写的"旧"系统,删除一些过时的功能并进行一些重构.感谢上帝,前一个人写了一些单元测试(MSTests).我对JUnit测试很满意,但对MSTests没有太多帮助.

测试方法有一个DeploymentItem属性,指定一个文本文件,该文件由正在测试的业务逻辑方法解析,而第二个DeploymentItem只指定了一个包含一堆必须部署的TIF文件的路径.

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

测试工作之前,但现在我不得不更改\ files\tif目录中包含的TIF文件的名称.根据规则,TIF文件名必须匹配特定模式,该模式也由ExistsTifTest()方法检查.现在我不得不更改文件名以使它们适应新的要求,突然之间不再像以前一样部署TIF文件.

有人能给我一个暗示,为什么会发生这种情况或可能是什么原因?如果我在\ files\valid \目录中的"valid_entries.txt"旁边添加一个新的文本文件"my2ndTest.txt",并在测试方法上使用相应的DeploymentItem属性,也会发生同样的事情.该文件未部署?

我通过直接在testrunco​​nfig中定义部署路径来获得现在部署的映像,但我想了解为什么会发生这些事情,或者为什么我的新文件"my2ndTest.txt"在其他人没有部署时会被部署.

Mar*_*eck 106

DeploymentItem 有点乱.

解决方案中的每个文件都将在VS.NET中具有"复制到输出文件夹"设置.您需要将其设置为"始终复制"(或类似)才能将文件放入输出文件夹.

检查您是否为新文件设置了此项.如果你没有这个设置,那么文件将不会被复制到输出文件夹,然后它们无法从输出文件夹部署到MSTest所做的文件夹.

就个人而言,如果我有单元测试所需的文件,我发现将这些文件作为资源嵌入到程序集中,并且在测试期间让该程序集"解包",这是一种更可预测的处理方式.因人而异.

注意:这些评论是基于我对VS2010的体验.对我的回答的评论表明这不是VS2012的问题.我仍然坚持认为使用嵌入式资源需要较少的"魔力",对我而言,使我的单元测试的"排列"阶段更加明确.

  • 如果DeploymentItem无法复制您提供的单个文件,那么它是如此的好. (29认同)
  • 在VS2010 Premium上,进行此更改(并且没有其他更改)导致文件部署.因此,我根据实际证据得出结论,它会影响MsTest部署. (19认同)
  • 复制到输出目录永远不会影响MSTest如何部署文件.这个答案是不正确的. (3认同)
  • VS2012上似乎不再需要这样做.我的部署项目正在部署,"复制到输出文件夹"设置为"不复制". (2认同)

小智 74

在VS2010中,我的Local.testsettings未选中"启用部署",并且DeploymentItem属性不起作用.我查了一下,一切正常.我希望这有帮助!

  • 我认为,如果框架发出警告,如果关闭此设置,则会忽略DeploymentItem属性,这样会很好.我也给我的桌子留下了漂亮的凹印. (12认同)
  • 我一直在用砖头撞击砖墙多年来试图让它起作用......谢谢! (2认同)
  • 请注意 Local.testsettings 在解决方案项中 (2认同)

小智 17

我也面临类似的问题,但我找到了简单的3步解决方案:

假设您的文件夹结构如下所示: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. 转到"解决方案项/ Local.testsettings">"部署">选中"启用部署"
  2. 如果您使用的是VS2010,请确保要部署的任何文件的"复制到输出文件夹"属性设置为"始终复制"或"如果更新则复制"
  3. 使用以下任一方法对TestMethod进行属性:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]将所有内容部署<SubFolder>到Test Run目录
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")] 到的所有内容部署<SubFolder><TargetFolder>在测试运行目录

关于MSTest的最后一点说明(至少对于VS2010):

如果你希望它<TargetFolder>具有与之相同的名称,则当MSTest运行器遇到愚蠢的边缘情况时<SubFolder>,使用[DeploymentItem(@"SubFolder", @"SubFolder")]将无声地失败.这就是为什么你应该<SubFolder>使用<TestProjectFolder>as作为前缀:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]


Pet*_* K. 14

希望能帮助其他人:我在这里尝试了所有建议,我的部署项目仍未被复制.

我必须做的(如此处所建议的)是在DeploymentItem属性中添加第二个参数:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
Run Code Online (Sandbox Code Playgroud)


Jos*_*ose 10

如果您进入.testrunco​​nfig文件并在部署中取消选中"启用部署",则测试将在其正常位置运行,并且一切都将像在单元测试之外运行应用程序时那样工作.


Mat*_*ear 8

这可能与您的确切问题无关,但这里有一些我在[DeploymentItem]属性中​​找到的提示.

  1. 复制到输出目录应设置为"始终复制".

与[TestInitialize]属性使用时工作

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{
Run Code Online (Sandbox Code Playgroud)

它应该在你的[TestMethod]上,例如

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 5

在尝试了这里列出的所有其他建议后,我仍然无法弄清楚发生了什么.最后,我发现在"测试/测试设置"菜单下没有选择任何设置文件,这意味着未启用部署.我点击了测试/测试设置/选择测试设置文件菜单项,选择了Local.TestSettings文件,然后一切正常.


Jes*_*ess 5

不要使用DeploymentItem.

很难正确设置,并且它不适用于我的 ReSharper 测试运行程序,也不适用于 Visual Studio 2017 中 MSTEST 的本机测试运行程序。

相反,右键单击您的数据文件,然后选择properties。选择复制到输出目录:始终

现在在你的测试中,这样做。该目录只是文件相对于测试项目的目录。简单。

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }
Run Code Online (Sandbox Code Playgroud)

这似乎适用于自动化构建和测试系统。