溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

IO擴(kuò)展控件(System.IO.Abstractions)

發(fā)布時(shí)間:2020-07-05 12:43:22 來(lái)源:網(wǎng)絡(luò) 閱讀:616 作者:石瞳禪 欄目:編程語(yǔ)言

剛看到這個(gè)Namespace的時(shí)候還以為是.Net Framework里自帶的包,結(jié)果查了一圈無(wú)任何結(jié)果。

果斷上Github,一擊即中https://github.com/tathamoddie/System.IO.Abstractions


先翻譯下開(kāi)發(fā)者給出的簡(jiǎn)單說(shuō)明,今后再慢慢使用


類(lèi)似于System.Web.Abstractions的用法,System.IO也被擴(kuò)展了,它能針對(duì)IO對(duì)象進(jìn)行訪(fǎng)問(wèn)

Just like System.Web.Abstractions, but for System.IO. Yay for testable IO access!

只能用NuGet方式下載

NuGet only:

Install-Package System.IO.Abstractions

如果有需要可以下載測(cè)試幫助包

and/or:

Install-Package System.IO.Abstractions.TestingHelpers

本庫(kù)最核心的2個(gè)文件是IFileSystem和FileSystem。使用IFileSystem.File.ReadAllText等方法替換掉之前的File.ReadAllText等方法。其他API也基本完全相同,除了一些我們擴(kuò)展和進(jìn)行測(cè)試的方法。

At the core of the library is IFileSystem and FileSystem. Instead of calling methods like File.ReadAllText directly, use IFileSystem.File.ReadAllText. We have exactly the same API, except that ours is injectable and testable.

public class MyComponent
{
    readonly IFileSystem fileSystem;

    // <summary>Create MyComponent with the given fileSystem implementation</summary>
    public MyComponent(IFileSystem fileSystem)
    {
        this.fileSystem = fileSystem;
    }
    /// <summary>Create MyComponent</summary>
    public MyComponent() : this( 
        fileSystem: new FileSystem() //use default implementation which calls System.IO
    ) 
    {
    }

    public void Validate()
    {
        foreach (var textFile in fileSystem.Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly))
        {
            var text = fileSystem.File.ReadAllText(textFile);
            if (text != "Testing is awesome.")
                throw new NotSupportedException("We can't go on together. It's not me, it's you.");
        }
    }
}

這個(gè)庫(kù)中還包含了一系列測(cè)試程序,來(lái)幫助你熟悉它。雖然它不是一個(gè)成熟的文件系統(tǒng),但是它一定會(huì)給你帶來(lái)幫助的。

The library also ships with a series of test helpers to save you from having to mock out every call, for basic scenarios. They are not a complete copy of a real-life file system, but they'll get you most of the way there.

[Test]
public void MyComponent_Validate_ShouldThrowNotSupportedExceptionIfTestingIsNotAwesome()
{
    // Arrange
    var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
    {
        { @"c:\myfile.txt", new MockFileData("Testing is meh.") },
        { @"c:\demo\jQuery.js", new MockFileData("some js") },
        { @"c:\demo\p_w_picpath.gif", new MockFileData(new byte[] { 0x12, 0x34, 0x56, 0xd2 }) }
    });
    var component = new MyComponent(fileSystem);

    try
    {
        // Act
        component.Validate();
    }
    catch (NotSupportedException ex)
    {
        // Assert
        Assert.AreEqual("We can't go on together. It's not me, it's you.", ex.Message);
        return;
    }

    Assert.Fail("The expected exception was not thrown.");
}

我們甚至支持把.NET框架里不可測(cè)試的類(lèi)型加入到測(cè)試程序里

We even support casting from the .NET Framework's untestable types to our testable wrappers:

FileInfo SomeBadApiMethodThatReturnsFileInfo()
{
    return new FileInfo("a");
}

void MyFancyMethod()
{
    var testableFileInfo = (FileInfoBase)SomeBadApiMethodThatReturnsFileInfo();
    //...
}





向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI