IOC / 注入 StreamReader,StreamWriter 依赖

IOC / Injecting StreamReader, StreamWriter Dependencies

我想了解如何正确注入来自 .NET Core 库(如 StreamReader 和 FileStream)的依赖项。我该如何注入这些?

我有一个 class 读取包含大量人口普查数据的文件,从中选择一个随机样本,然后 returns 它作为多行字符串发送给调用者。它更新一个 FileStream 以访问文件的内容,然后更新一个 StreamReader 以读取 FileStream 内容,以便我可以操作文本。但是,我希望使该单元可测试。如果我需要注入 class 我自己创建了一个接口来实现 class 并将其传递给构造函数,但这是一个 .NET Core 类型并且没有 IFileStream、IStreamWriter ,等等,我可以注入。注入这些的正确方法是什么,以便我可以在单元测试期间替换为模拟?

namespace MyNS.Lib
 {
using System.IO;
using System.Text;
using PgpCore;

/// <summary>
/// A class for PGP encrypting strings.
/// </summary>
public class EncryptUtility
{
    /// <summary>
    /// Initializes a new instance of the <see cref="EncryptUtility"/> class.
    /// </summary>
    /// <param name="sampler">The CensusSampler needed by the class.</param>
    public EncryptUtility(CensusSampler sampler)
    {
        Sampler = sampler;
    }

    /// <summary>
    /// Encrypts a census file.
    /// </summary>
    /// <param name="censusFilePath">The path to the census file.</param>
    /// <param name="keyPath">The path to the public key file.</param>
    /// <returns>Returns an encrypted census file.</returns>
    public string EncryptCensus(string censusFilePath, string keyPath)
    {
        using (FileStream census = new FileStream(censusFilePath, FileMode.Open))
        {
            var censusSr = new StreamReader(census);
            var censusText = censusSr.ReadToEnd();
            return EncryptString(censusText, keyPath);
        }
    }
}
}

我认为@devNull 所说的可能是最有道理的。通过封装依赖于注入和模拟的东西的代码部分,我已经将 需要 测试的代码部分与依赖的部分分开了在 .NET Core 运行时上。我真的不需要测试 EncryptCensus,因为我唯一要测试的是 StreamReader 工作,这似乎没有必要。所以我只测试 EncryptString。谢谢!