1

我刚读完《单元测试的艺术》这本书,遇到了一个关于测试模式的架构问题。

为了测试是否使用了外部库的方法,本书建议使用接口制作包装器。这样,您就可以使用接口进行模拟。我做了一个使用 .net 方法 File.Exists 的例子

public interface IFile
{
    bool Exists(string path);
}


public class File : IFile
{
    bool IFile.Exists(string path)
    {
        return System.IO.File.Exists(path);
    }
}


[TestMethod]
[ExpectedException(typeof(System.IO.FileNotFoundException))]
public void Constructor_WithNonExistingFile_ThrowsFileNotFoundException()
{
    Mock<IFile> fileMock = new Mock<IFile>();
    Mock<ICompositionContainer> compositionMock
        = new Mock<ICompositionContainer>();

    fileMock.Setup(f => f.Exists(It.IsAny<string>())).Returns(false);

    Loader<object> loader = new Loader<object>(
        "testfile",
        fileMock.Object,
        compositionMock.Object);
}

我的问题是这是否是一种好的做法,如果是这样,我应该为我想要测试的所有 .net 方法/类制作接口和包装器吗?

4

1 回答 1

1

做了很多嘲笑之后,我得出一个结论,嘲笑应该是最后的手段。我发现 mocking tie 测试代码太多,并且通常掩盖了不可测试的代码。此类与实现联系太多的测试被认为是脆弱的。在这种情况下,我不会围绕 .NET 文件 I/O 内容创建包装接口,而是直接使用文件 I/O 内容。我将使用真正的依赖关系,因为文件系统存在于测试机器上。然后,在我的测试 Setup() 方法中,我将确保满足测试的先决条件,例如创建文件。在拆卸方法中,我将确保完成必要的清理工作。

有时,您不能使用真正的依赖项——例如,您正在通过网络调用服务。模拟应该仅限于此类事情。即使在这种情况下,您也不必嘲笑。您可以考虑使用假的 - 基本上为您的测试构建服务的内存版本并使用该版本。

于 2014-10-19T16:28:37.003 回答