gpt4 book ai didi

c# - 使用 File.OpenRead() 对类进行单元测试

转载 作者:行者123 更新时间:2023-11-30 19:53:40 27 4
gpt4 key购买 nike

我想测试一个使用 File.OpenRead() 方法获取文件内容的类。读取文件的内容后,它会处理它们。我已经创建了一个接口(interface)和一个包装静态 OpenRead() 方法的类。但是我遇到了 OpenRead() 返回 FileStream 的问题,我不知道如何“模拟”文件流。

目前,我正在创建一个文件,只是为了创建一个 FileStream...当然,测试经常会因 IOException 而失败,因为该文件仍在使用中...

剥离示例:类:

class FileProcessor
{
public FileProcessor(IFileWrap fileWrap) // fileWrap only redirects the calls to the static methods of File class
{ ... }

public void Process(string file)
{
var content = fileWrap.ReadAllLines(file);

// process content
}
}

和测试:

[TestClass]
public class FileProcessor_Test
{
[TestMethod]
Process_FileNotReadable_Exception()
{
File.WriteAllText(testFile, "something");
var fileWrapMock = new Mock<IFileWrap>();
FileProcessor dut = new FileProcessor(fileWrapMock.Object);
var actualException = AssertException.Throws<Exception>(() => dut.Process(testFile));
}
}

我也想避免创建 FileStream 的抽象。

我希望我可以创建一个 MemoryStream 并以某种方式将其用作输入,但这需要更改文件包装器并偏离实际的 File 类.

欢迎任何意见:)

编辑:该处理包括通过从类 MD5 调用 ComputeHash() 来计算 MD5 校验和。

最佳答案

您的原始方法与它对文件进行操作的事实紧密相关。不要那样做。使方法采用 Stream , 任何 流。您可以对 FileStream 进行操作, 或者你可以传递 MemoryStream供测试用。

public void Process(string file)

应该是

public void Process(Stream stream)

如果你愿意,为了方便,你可以有第二个方法重载:

public void Process(string file)
{
using (var stream = new FileStream(file, FileMode.Open))
{
this.Process(stream);
}
}

确实不能也不应该进行单元测试...它是处理外部资源的 .NET 代码,在某些时候您必须信任该框架。


为了解决您的编辑问题:大多数框架类都做类似的事情,例如 MD5 类有一个 ComputeHash适用于流的方法。

关于c# - 使用 File.OpenRead() 对类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com