Tim*_*ong 2 c# tdd unit-testing
我正在开发一个简单的项目,作为TDD中的练习而不是其他任何东西.该程序从Web服务器获取一些图像并将其保存为文件.为了记录,我正在做的(我期望的最终结果)与这个perl脚本非常相似,但在C#中.
我已经到了需要将文件保存到磁盘的地步.我需要进行单元测试来强制执行代码.我不知道如何处理这个问题.我希望能够验证代码是否创建了具有预期文件名的预期文件,当然我根本不想触摸文件系统.我并不是单元测试和TDD的新手,但出于某种原因,我真的不清楚在这种情况下该怎么做.我确信,一旦我看到它,答案就会很明显,但......我脑中一个代码来自的神秘地方就是不合作.
我选择的工具是MSpec和FakeItEasy,但感谢任何框架中的建议.什么是单元测试文件系统交互的明智方法?
这将有助于依赖注入.将整体下载操作分解为更小的部分并将它们注入下载程序.声明这些部分的接口:
public interface IImageFetcher
{
IEnumerable<Image> FetchImages(string address);
}
public interface IImagePersistor
{
void StoreImage(Image image, string path);
}
Run Code Online (Sandbox Code Playgroud)
使用这些声明,您可以编写一个下载程序类,它集成了以下所有内容:
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++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,ImageDownloader不知道将使用哪些实现以及它们如何工作.
现在,您可以在测试时提供虚拟持久性,将文件名存储在List<string>例如,而不是提供存储到文件系统的真实存储.
UPDATE
// For testing purposes only.
class DummyImagePersistor
{
public readonly List<string> Filenames = new List<string>();
public void StoreImage(Image image, string path)
{
Filenames.Add(path);
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
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);
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
553 次 |
| 最近记录: |