簡體   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