首页 > 解决方案 > 不要在测试中共享静态属性

问题描述

我必须使用 xUnit 为现有代码编写测试。这是我遇到的一个简化问题:

using Xunit;

namespace XUnitTestProject1
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            GlobalHanler.StaticProperty = "some value";
        }

        [Fact]
        public void Test2()
        {
            Assert.Null(GlobalHanler.StaticProperty);
        }
    }

    public static class GlobalHanler
    {
        public static string StaticProperty;
    }
}

GlobalHandler 拥有另一个对象,两者都是静态的

当我一起运行 2 个测试时,Test2会失败,因为它可以看到在Test1. 但是,当我Test2单独运行时,它会成功。

我的目标是让 2 个测试一起运行时通过。我需要以某种方式分别为每个测试重置全局静态属性,但我无法更改GlobalHandler

在每个测试方法中设置StaticProperty似乎不是一个选项,因为它会影响并行运行的其他测试

标签: c#.netunit-testing.net-corexunit.net

解决方案


为了获得可测试的代码,您应该首先将逻辑放在一个可以根据需要创建多次的类中,然后通过传递引用在您的代码中使用该类。

您的生产代码始终可以使用单例,但没有对单例的直接引用使其可测试。

由于可能的副作用和不明确的依赖关系,单例和测试不能很好地共存。


推荐阅读