Moles 在静态构造函数中不起作用
Posted
技术标签:
【中文标题】Moles 在静态构造函数中不起作用【英文标题】:Moles does not work in static constructors 【发布时间】:2011-07-01 09:06:19 【问题描述】:我一直遇到 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");
... 现在 Moles 不再起作用了。运行此测试时,我收到错误“找不到文件 'd:\blah\blah\test.txt'”。我得到这个是因为 Moles 不再负责我的 FileSystem 类,所以单元测试正在调用在文件系统上寻找文件的原始实现。
因此,唯一的变化是调用 Moled 方法的类现在是静态的。我没有更改 Moled 类或方法,它们仍然是实例类型,所以我不能使用 Implementation.Moles.SFileSystem 用于模拟静态类的语法。
请有人帮忙解释一下如何让 Moles 在静态方法/构造函数中工作?
非常感谢!!!
【问题讨论】:
【参考方案1】:静态构造函数不同于静态方法。使用方法,您可以控制何时何地调用它。在执行对类的任何访问之前,运行时会自动调用构造函数,在这种情况下,会导致在设置 FileSystem
的摩尔之前调用构造函数,从而导致您看到的错误。
如果您将实现更改为以下内容,那么它应该可以工作。
public static class StaticTestReader
private static string content;
public static string Content
get
if (content == null)
IFileSystem fileSystem = new FileSystem();
content = fileSystem.ReadAllText("test.txt");
return content;
更新:
但是,如果您无法更改实现,Moles 提供的唯一其他选择是阻止静态构造函数中的代码被执行,然后直接删除 Content
属性。要删除某个类型的静态构造函数,您需要在测试程序集中包含以下程序集级别属性:
[assembly: MolesEraseStaticConstructor(typeof(StaticTestReader))]
【讨论】:
【参考方案2】:我认为您必须从声明中删除 AllInstances。要访问静态,您不需要类的实例。
试试这个:
Implementation.Moles.MFileSystem.ReadAllTextString = (...)
【讨论】:
以上是关于Moles 在静态构造函数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
调用 setVisible(false) 在 QWidget 的构造函数中不起作用
模板参数在具有相同数据类型的单个typename的构造函数中不起作用