[英]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.