代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

MSTest unit test自身通过,在运行其他测试时失败

  •  5
  • Sarah Vessels  · 技术社区  · 15 年前

    SLaks helped me with earlier ,他警告我我所做的不是线程安全的。然而,现在我的代码更复杂了,我不知道如何使它成为线程安全的。以下是我所拥有的:

    public static class DLLConfig
    {
        private static string _domain;
    
        public static string Domain
        {
            get
            {
                return _domain = AlwaysReadFromFile
                    ? readCredentialFromFile(DOMAIN_TAG)
                    : _domain ?? readCredentialFromFile(DOMAIN_TAG);
            }
        }
    }
    

    我的测试很简单:

    string expected = "the value I know exists in the file";
    string actual = DLLConfig.Domain;
    Assert.AreEqual(expected, actual);
    

    actual null 测试失败了。我注意到,对于类型为自定义的属性,这不是问题 Enum Domain 因为它是 string ? 或者这是一个多线程的问题,MSTest如何工作?

    3 回复  |  直到 8 年前
        1
  •  6
  •   Lee    15 年前

    我怀疑其他测试正在修改 DLLConfig 导致getter结果更改的类。单元测试应该总是从一个已知的初始状态运行,所以您应该在测试方法本身中或者在一个标记为 TestInitialize

        2
  •  5
  •   Kenneth Cochran    15 年前

    public static string Domain
    {
        get
        {
            return _domain = AlwaysReadFromFile
                ? CredentialReader.Read(DOMAIN_TAG)
                : _domain ?? CredentialReader.Read(DOMAIN_TAG);
        }
    }
    

    然后可以使用mock/fake/stub CredentialReader初始化DllConfig,在这里可以控制其返回值。请记住,您正在测试DLLConfig.Domain是否基于 AlwaysReadFromFile 条件。您不应该同时测试该值来自何处(或者它是否存在)。

    使DLLConfig类更“可测试”,还有一个额外的好处,那就是分离关注点。当你在想一门课的时候,忍不住要说“这门课有” 以及

        3
  •  1
  •   Loul G.    11 年前

    如果上面的答案都不适用于你,我通过添加 Thread.Sleep(1)

    好像在什么地方错过了测试同步。。。请注意,我的测试不是顺序依赖的,我没有任何静态成员也没有外部依赖。

        4
  •  0
  •   David Ehnis    5 年前

    对我来说,问题是使用非线程安全的集合。当我切换到使用BlockingCollection(而不是List)时,一切都恰到好处。