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。谢谢!
我想了解如何正确注入来自 .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。谢谢!