我一直遇到 Mole 类型在静态构造函数中不起作用的问题。我创建了两个简单的例子来解释这个问题:
我有一个简单的实例类如下:
public class InstanceTestReader
{
public InstanceTestReader ()
{
IFileSystem fileSystem = new FileSystem();
this.Content = fileSystem.ReadAllText("test.txt");
}
public string Content { get; private set; }
}
我对此进行了单元测试,如下所示:
[TestMethod]
[HostType("Moles")]
public void CheckValidFileInstance_WithMoles()
{
// Arrange
string expectedFileName = "test.txt";
string content = "test text content";
Implementation.Moles.MFileSystem.AllInstances.ReadAllTextString = (moledTarget, suppliedFilename) =>
{
Assert.AreEqual(suppliedFilename, expectedFileName, "The filename was incorrect");
return content;
};
// Act
string result = new InstanceTestReader().Content;
// Assert
Assert.AreEqual(content, result, "The result was incorrect");
}
这没有问题。
但是,如果我将调用类更改为静态(不是 Moled 类,而是调用类),则 Moles 不再起作用:
public static class StaticTestReader
{
static StaticTestReader ()
{
IFileSystem fileSystem = new FileSystem();
Content = fileSystem.ReadAllText("test.txt");
}
public static string Content { get; private set; }
}
并相应地修改我的单元测试:
[TestMethod]
[HostType("Moles")]
public void CheckValidFileStatic_WithMoles()
{
// Arrange
string expectedFileName = "test.txt";
string content = "test text content";
Implementation.Moles.MFileSystem.AllInstances.ReadAllTextString = (moledTarget, suppliedFilename) =>
{
Assert.AreEqual(suppliedFilename, expectedFileName, "The filename was incorrect");
return content;
};
// Act
string result = StaticTestReader.Content;
// Assert
Assert.AreEqual(content, result, "The result was incorrect");
}
......现在鼹鼠不再起作用了。运行此测试时,我收到错误“找不到文件 'd:\blah\blah\test.txt'”。我得到这个是因为 Moles 不再负责我的 FileSystem 类,所以单元测试正在调用在文件系统上寻找文件的原始实现。
因此,唯一的变化是调用 Moled 方法的类现在是静态的。我没有更改 Moled 类或方法,它们仍然是实例类型,所以我不能使用 Implementation.Moles.SFileSystem 语法,因为这将用于模拟静态类。
请有人帮忙解释我如何让 Moles 在静态方法/构造函数中工作?
非常感谢!!!