MSTest单元测试自行通过,在运行其他测试时失败

Sar*_*els 6 c# unit-testing mstest

我遇到了一些MSTest单元测试的麻烦,当我单独运行它们时会通过,但是当我运行整个单元测试类时会失败.测试测试了一些SLaks早先帮助我的代码,他警告我,我在做什么并不是线程安全的.但是,现在我的代码更复杂,我不知道如何使其成为线程安全的.这就是我所拥有的:

public static class DLLConfig
{
    private static string _domain;

    public static string Domain
    {
        get
        {
            return _domain = AlwaysReadFromFile
                ? readCredentialFromFile(DOMAIN_TAG)
                : _domain ?? readCredentialFromFile(DOMAIN_TAG);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试很简单:

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

当我自己运行这个测试时,它会通过.当我运行它沿着在测试类的所有其他的测试(其上执行不同的性质类似的检查),actualnull与测试失败.我注意到,对于类型为自定义Enum类型的属性,这不是问题.也许我对这个Domain属性有这个问题,因为它是一个string?或者这可能是MSTest如何工作的多线程问题?

Lee*_*Lee 6

我怀疑其他测试正在修改DLLConfig类中导致getter结果发生变化的值.单元测试应该始终从已知的初始状态运行,因此您应该在测试方法本身或在TestInitialize每个测试之前运行的属性标记的方法中设置它.


Ken*_*ran 5

您的测试取决于外部文件.而不是调用直接访问该文件的函数,您应该让DLLConfig.Domain调用另一个类中的方法.

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

然后,您可以使用mock/fake/stub CredentialReader初始化DllConfig,您可以在其中控制其返回值.请记住,您正在测试DLLConfig.Domain是否根据AlwaysReadFromFile条件返回正确的值.您不应该同时测试该值的来源(或者甚至是否存在).

使您的DLLConfig类更"可测试"具有分离问题的额外好处.当你在考虑一个类时,不得不说"这个类做了这个 那个 "(抽象配置数据并从文件中读取数据),这是一个很好的选择,这个类混合了关注点并试图做很多事情.如果DLLConfig是配置数据的抽象,它应该只关注它,并将数据从哪里留到另一个类.