gpt4 book ai didi

c# - 对与文件系统的交互进行单元测试的好方法是什么?

转载 作者:行者123 更新时间:2023-12-02 21:57:34 25 4
gpt4 key购买 nike

我正在做一个简单的项目,更多的是作为 TDD 的练习,而不是其他任何事情。该程序从网络服务器获取一些图像并将它们保存为文件。根据记录,我正在做的事情(我想要的最终结果)与 this perl script 非常相似。但在 C# 中。

我已经到了需要将文件保存到磁盘的地步。我需要进行单元测试来强制执行代码。我不知道如何解决这个问题。我希望能够验证代码是否使用预期的文件名创建了预期的文件,当然我根本不想接触文件系统。我对单元测试和 TDD 并不是完全陌生,但由于某种原因,我真的不清楚在这种情况下该怎么做。我相信一旦我看到它,答案就会显而易见,但是......我大脑中代码来源的神秘地方就是不合作。

我选择的工具是 MSpec 和 FakeItEasy,但任何框架中的建议将不胜感激。单元测试文件系统交互的合理方法是什么?

最佳答案

这里有帮助的是依赖注入(inject)。将整体下载操作分解为较小的部分并将它们注入(inject)下载器中。声明这些部分的接口(interface):

public interface IImageFetcher
{
IEnumerable<Image> FetchImages(string address);
}

public interface IImagePersistor
{
void StoreImage(Image image, string path);
}

通过这些声明,您可以编写一个集成整个内容的下载器类,如下所示:

public class ImageDownloader
{
private IImageFetcher _imageFetcher;
private IImagePersistor _imagePersistor;

// Constructor injection of components
public ImageDownloader(IImageFetcher imageFetcher, IImagePersistor imagePersistor)
{
_imageFetcher = imageFetcher;
_imagePersistor = imagePersistor;
}

public void Download(string source, string destination)
{
var images = _imageFetcher.FetchImages(source);
int i = 1;
foreach (Image img in images) {
string path = Path.Combine(destination, "Image" + i.ToString("000"));
_imagePersistor.StoreImage(img, path);
i++;
}
}
}

请注意ImageDownloader不知道将使用哪些实现以及它们如何工作。

现在,您可以在测试时提供一个虚拟持久器,它将文件名存储在 List<string> 中。例如,而不是提供存储到文件系统的真实数据。


更新

// For testing purposes only.
class DummyImagePersistor
{
public readonly List<string> Filenames = new List<string>();

public void StoreImage(Image image, string path)
{
Filenames.Add(path);
}
}

测试:

var persistor = new DummyImagePersistor();
var sut = new ImageDownloader(new ImageFetcher(), persistor);
sut.Download("http://myimages.com/images", "C:\Destination");
Assert.AreEqual(10, persistor.Filenames.Count);
...

关于c# - 对与文件系统的交互进行单元测试的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493071/

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