C# IOC/StreamReader、StreamWriter依赖项

C# IOC/StreamReader、StreamWriter依赖项,c#,inversion-of-control,streamreader,streamwriter,C#,Inversion Of Control,Streamreader,Streamwriter,我希望了解如何正确注入来自.NET核心库(如StreamReader和FileStream)的依赖项。我如何注射这些 我有一个类,它读入一个包含大量人口统计数据的文件,对其进行随机抽样,然后将其作为多行字符串返回给调用者。它向上更新文件流以访问文件内容,然后向上更新StreamReader以读取文件流内容,这样我就可以操纵文本。然而,我希望使这个单元可以测试。如果我需要注入一个我自己创建的类,我会为该类生成一个接口来实现并将其传递到构造函数中,但这是一个.NET核心类型,没有我可以注入的IFil

我希望了解如何正确注入来自.NET核心库(如StreamReader和FileStream)的依赖项。我如何注射这些

我有一个类,它读入一个包含大量人口统计数据的文件,对其进行随机抽样,然后将其作为多行字符串返回给调用者。它向上更新文件流以访问文件内容,然后向上更新StreamReader以读取文件流内容,这样我就可以操纵文本。然而,我希望使这个单元可以测试。如果我需要注入一个我自己创建的类,我会为该类生成一个接口来实现并将其传递到构造函数中,但这是一个.NET核心类型,没有我可以注入的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);
        }
    }
}
}
名称空间MyNS.Lib
{
使用System.IO;
使用系统文本;
使用PgpCore;
/// 
///用于PGP加密字符串的类。
/// 
公共类加密实用程序
{
/// 
///初始化类的新实例。
/// 
///这个班需要的审查员。
公用事业公司(CensusSampler采样器)
{
取样器=取样器;
}
/// 
///加密普查文件。
/// 
///人口普查文件的路径。
///公钥文件的路径。
///返回加密的普查文件。
公共字符串EncryptCensus(字符串censusFilePath、字符串keyPath)
{
使用(FileStream census=newfilestream(censusFilePath,FileMode.Open))
{
var censusSr=新的StreamReader(人口普查);
var censusText=censusSr.ReadToEnd();
返回EncryptString(censusText,keyPath);
}
}
}
}

我认为@devNull所说的可能最有意义。通过封装依赖于注入和模拟没有意义的东西的代码部分,我已经将需要测试的代码部分与依赖.NET核心运行时的代码部分分离了出来。我真的不需要测试EncryptCensus,因为我唯一要测试的是StreamReader可以工作,这似乎是不必要的。所以我只测试加密字符串。谢谢

我认为@devNull所说的可能最有意义。通过封装依赖于注入和模拟没有意义的东西的代码部分,我已经将需要测试的代码部分与依赖.NET核心运行时的代码部分分离了出来。我真的不需要测试EncryptCensus,因为我唯一要测试的是StreamReader可以工作,这似乎是不必要的。所以我只测试加密字符串。谢谢

是的,这有点愤怒,因为仅为测试目的注入filestream和streamreader似乎是可疑的。。我更倾向于让您的可测试方法采用
没有我可以注入的IFileStream、IStreamWriter等,然后自己创建它们,并让实现包装实际的东西。您实际想要测试的功能是什么?我假设它是
EncryptString
方法中的任何内容。如果是这样的话,你能直接测试该方法并避免所有的
StreamReader
交互吗?是的,这有点愤怒,因为注入filestream和StreamReader只是为了测试目的似乎是可疑的。。我更倾向于让您的可测试方法采用
没有我可以注入的IFileStream、IStreamWriter等,然后自己创建它们,并让实现包装实际的东西。您实际想要测试的功能是什么?我假设它是
EncryptString
方法中的任何内容。如果是这样的话,您能直接测试该方法并避免所有的
StreamReader
交互吗?