Moles在静态构造函数中不起作用

时间:2011-07-01 09:06:20

标签: static constructor moles

我遇到了在静态构造函数中不起作用的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在静态方法/构造函数中工作?

非常感谢!!!

2 个答案:

答案 0 :(得分:4)

静态构造函数与静态方法不同。使用一种方法,您可以控制其调用的时间和位置。在执行对类的任何访问之前,运行时会自动调用构造函数,在这种情况下会导致在FileSystem的mole设置之前调用构造函数,从而导致出现错误。

如果您将实现更改为以下内容,那么它应该可以正常工作。

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))]

答案 1 :(得分:0)

我认为您必须从声明中删除 AllInstances 。要访问静态,您不需要类的实例。

试试这个:

Implementation.Moles.MFileSystem.ReadAllTextString = (...)