【问题标题】:How do I remove stale DeploymentItems in unit tests?如何在单元测试中删除过时的 DeploymentItem?
【发布时间】:2011-05-05 19:40:44
【问题描述】:

考虑以下测试类:

[TestClass]
public class ExampleTests
{
    [TestMethod]
    public void FileDoesNotExists()
    {
        Assert.IsFalse(System.IO.File.Exists("testfile.txt"));
    }

    [TestMethod]
    [DeploymentItem("testfile.txt")]
    public void FileExists()
    {
        Assert.IsTrue(System.IO.File.Exists("testfile.txt"));
    }

}

根据这些测试的运行顺序,它们可能通过,但由于无法保证它们会按照定义的顺序运行,因此现实世界的行为是不确定的。 . 显然这很糟糕。

我环顾四周并尝试了 TestCleanupAttribute,但未能找到一种可靠的方法让两个测试都通过,但似乎应该有一种简单的方法可以做到这一点。有这样的方法吗?

更新: 这似乎是不可能的,因为测试框架假定 DeploymentItems 在部署后不会更改,因此每个项目只部署一次。在短期内,我已将被测代码更改为不再需要这种行为,从长远来看,我很可能会实现一个不做这种假设的属性。

【问题讨论】:

    标签: c# unit-testing mstest deploymentitem


    【解决方案1】:

    DeploymentItems 实际上是您通常会部署到客户计算机上的文件,因此您不打算在部署它们后删除它们

    您应该为您的单元测试创​​建一个“沙盒”目录,并使用普通的 .NET 文件系统方法(如 File.Delete)来执行您的文件复制/访问/删除操作。

    【讨论】:

    • 我试图测试的行为是缺少(预期但不是严格要求的)配置文件时的行为,但是在需要相同项目的不同版本的情况下,这种行为也是有问题的部署用于不同的测试。沙箱目录似乎可行但并不理想,因为它增加了每次测试所需的样板代码量。
    • 我有时会将这种重复的文件访问代码卸载到具有静态函数的静态类中。我无法使用 mstest 找到解决方法,但 xUnit.net 似乎有一个有趣的界面。即 IUseFixture 您自己为类定义 DeploymentFixture 并在每次测试之前运行适当的方法。
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2014-05-08
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多