繁体   English   中英

制作模拟dotnet库的接口

[英]making interfaces for mocking dotnet libraries

我刚读完《单元测试的艺术》一书,就测试模式提出了一个架构上的问题。

为了测试是否使用外部库的方法,该书建议使用接口制作包装器。 这样,您就可以使用该接口进行模拟。 我举了一个使用.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方法/类创建接口和包装?

经过大量的模拟,我得出的结论是,模拟应该是最后的手段。 我发现嘲笑关系测试对代码来说太多了,通常掩盖了不可测试的代码。 这种与实现紧密相关的测试被认为是脆弱的。 在这种情况下,与其直接围绕.NET File I / O东西创建包装器接口,不如直接使用File I / O东西。 由于文件系统存在于测试计算机上,因此我将使用真正的依赖关系。 然后,在我的测试Setup()方法中,我将确保满足测试的前提条件,例如创建文件。 在拆卸方法中,我将确保进行必要的清理。

有时,您不能使用真正的依赖关系-例如,您正在通过网络调用服务。 只能在这种情况下限制模仿。 即使在这种情况下,您也不必嘲笑。 您可以考虑使用假冒产品-基本上是为测试构建服务的内存版本并使用该版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM