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)
当我自己运行这个测试时,它会通过.当我运行它沿着在测试类的所有其他的测试(其上执行不同的性质类似的检查),actual
是null
与测试失败.我注意到,对于类型为自定义Enum
类型的属性,这不是问题.也许我对这个Domain
属性有这个问题,因为它是一个string
?或者这可能是MSTest如何工作的多线程问题?
我怀疑其他测试正在修改DLLConfig
类中导致getter结果发生变化的值.单元测试应该始终从已知的初始状态运行,因此您应该在测试方法本身或在TestInitialize
每个测试之前运行的属性标记的方法中设置它.
您的测试取决于外部文件.而不是调用直接访问该文件的函数,您应该让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是配置数据的抽象,它应该只关注它,并将数据从哪里留到另一个类.