一个方便IO单元测试的C#扩展库
创始人
2024-01-17 01:04:38
0

对于我们.Net程序员,System.Web.Abstractions我们都非常熟悉,主要作用于Web可以实现单元测试,他是在.Net framework 3.5 sp1开始引入的,很好的解决项目表示层不好做单元测试的问题,这个库所有类都是Wrapper/Decorator模式的。今天给推荐一个IO的扩展库与System.Web.Abstractions一样的,用来支持IO实现单元测试功能。

项目简介

一个支持IO实现单元测试的扩展库,支持跨平台,与File所有API接口都一样,方便我们项目扩展、迁移。

项目结构

图片

项目主要核心文件是IFileSystem和FileSystem。

技术架构

1、平台:基于Net4、Netstandard2.0开发

2、开发工具:Visual Studio 2017

使用方法

读取文本使用例子,使用方法与File类一样,都是使用相同API名ReadAllText,只是这个API支持可注入和可测试的。

public class MyComponent
{
readonly IFileSystem fileSystem;// Create MyComponent with the given fileSystem implementation
public MyComponent(IFileSystem fileSystem){
this.fileSystem = fileSystem;}
/// Create MyComponent
public MyComponent() : this( fileSystem: new FileSystem() //use default implementation which calls System.IO){}public void Validate(){
foreach (var textFile in fileSystem.Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly)){
var text = fileSystem.File.ReadAllText(textFile);
if (text != "Testing is awesome.")
throw new NotSupportedException("We can't go on together. It's not me, it's you.");}}
}

文件创建单元测试

        [Test]
public void Mockfile_Create_ShouldCreateNewStream(){
string fullPath = XFS.Path(@"c:\something\demo.txt");
var fileSystem = new MockFileSystem();fileSystem.AddDirectory(XFS.Path(@"c:\something"));var sut = new MockFile(fileSystem);Assert.That(fileSystem.FileExists(fullPath), Is.False);sut.Create(fullPath).Dispose();Assert.That(fileSystem.FileExists(fullPath), Is.True);}

删除文件单元测试

        [Test]
public void MockFile_Delete_ShouldDeleteFile(){
var fileSystem = new MockFileSystem();
var path = XFS.Path("C:\\test");
var directory = fileSystem.Path.GetDirectoryName(path);fileSystem.AddFile(path, new MockFileData("Bla"));var fileCount1 = fileSystem.Directory.GetFiles(directory, "*").Length;fileSystem.File.Delete(path);
var fileCount2 = fileSystem.Directory.GetFiles(directory, "*").Length;Assert.AreEqual(1, fileCount1, "File should have existed");Assert.AreEqual(0, fileCount2, "File should have been deleted");}

文件复制单元测试

        [Test]
public void MockFile_Copy_ShouldOverwriteFileWhenOverwriteFlagIsTrue(){
string sourceFileName = XFS.Path(@"c:\source\demo.txt");
var sourceContents = new MockFileData("Source content");
string destFileName = XFS.Path(@"c:\destination\demo.txt");
var fileSystem = new MockFileSystem(new Dictionary{{sourceFileName, sourceContents},{destFileName, new MockFileData("Destination content")}});fileSystem.File.Copy(sourceFileName, destFileName, true);var copyResult = fileSystem.GetFile(destFileName);Assert.AreEqual(copyResult.Contents, sourceContents.Contents);}

文件移动单元测试

 [Test]
public void MockFile_Move_ShouldMoveFileWithinMemoryFileSystem(){
string sourceFilePath = XFS.Path(@"c:\something\demo.txt");
string sourceFileContent = "this is some content";
var fileSystem = new MockFileSystem(new Dictionary{{sourceFilePath, new MockFileData(sourceFileContent)},{XFS.Path(@"c:\somethingelse\dummy.txt"), new MockFileData(new byte[] {0})}});string destFilePath = XFS.Path(@"c:\somethingelse\demo1.txt");fileSystem.File.Move(sourceFilePath, destFilePath);Assert.That(fileSystem.FileExists(destFilePath), Is.True);Assert.That(fileSystem.GetFile(destFilePath).TextContents, Is.EqualTo(sourceFileContent));Assert.That(fileSystem.FileExists(sourceFilePath), Is.False);}

支持 .NET Framework用法

FileInfo SomeBadApiMethodThatReturnsFileInfo(){return new FileInfo("a");}void MyFancyMethod(){var testableFileInfo = (FileInfoBase)SomeBadApiMethodThatReturnsFileInfo();    ...}

项目地址:https://github.com/Haydabase/System.IO.Abstractions

- End -

推荐阅读

  • 推荐一个C#操作SVG图形矢量图的开源项目

  • 一个支持DOCX、PPTX、Html等文件合并、拆分、互相转换的C#开源项目

  • 盘点10个.NetCore实用的开源框架项目

  • 盘点5个C#开发的、可用于个人博客的系统

  • 一个基于Quartz.Net开发的Windows版本的进程监控

专注分享编程知识、热门有用有趣的开源项目

上一篇:抬起你的头

下一篇:一张丢失的扑克牌

相关内容

热门资讯

汽车公司庆典主持词 汽车公司庆典主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。现今社会在不断向前发...
古筝音乐会主持词 古筝音乐会主持词6篇  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在一步步向前发展...
小学元旦联欢会主持词开场白和... 小学元旦联欢会主持词开场白和结束词  根据活动对象的不同,需要设置不同的主持词。随着社会一步步向前发...
知识竞赛主持词 知识竞赛主持词(精选6篇)  主持词的写作需要将主题贯穿于所有节目之中。在人们越来越多的参与各种活动...
小学家长会学生欢迎词 小学家长会学生欢迎词小学家长会学生欢迎词文章标题:小学家长会学生欢迎词家长会欢迎辞亲爱的叔叔阿姨,爷...
消夏晚会主持词 2017消夏晚会主持词  漫漫暑假,天气越来越燥热,不妨在炎热的午后,参加一场纳凉晚会,欣赏社区带来...
周立波脱口秀台词 周立波脱口秀台词集锦四十岁之前喝酒是为了别人的一句~~厉害!醉了!!四十岁以后喝酒是为了自己的一句~...
圣诞节活动主持词节目串词 圣诞节活动主持词节目串词3篇  根据活动对象的不同,需要设置不同的主持词。在人们积极参与各种活动的今...
生日华诞主持词 生日华诞主持词范文各位领导,各位朋友,各位来宾,女士们,先生们:  中午好。  今天是个喜庆的日子,...
学术会议主持词 学术会议主持词  什么是主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集会...
订婚仪式及主持词 订婚仪式及主持词范文(通用3篇)  活动对象的不同,主持词的写作风格也会大不一样。在现在的社会生活中...
古剑奇谭欧阳少恭经典台词参考 古剑奇谭欧阳少恭经典台词参考  大型古装玄幻剧《古剑奇谭》正在湖南卫视热播,剧中,乔振宇饰演温文尔雅...
幼儿园晨会主持词 幼儿园晨会主持词  美好的一天从早上开始,从晨会开始,从大家的好的状态开始,从最好的开始。以下是小编...
诗文诵读展示主持词 诗文诵读展示主持词  主持词没有固定的格式,他的最大特点就是富有个性。在当今不断发展的世界,很多晚会...
大学生毕业典礼的主持词 大学生毕业典礼的主持词(精选5篇)  活动对象的不同,主持词的写作风格也会大不一样。在当下的社会中,...
婚礼的主持词 婚礼的主持词  婚礼的主持词(精选21篇)  主持词的写作要突出活动的主旨并贯穿始终。随着社会一步步...
主婚人致辞 主婚人致辞(精选6篇)  在生活、工作和学习中,大家都写过致辞吧,致辞具有很强的实用性和针对性。还在...
促销活动主持词 促销活动主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在现今人们越来越重视活动...
小品活动的主持词 小品活动的主持词  【篇一】  各位亲爱的老师,同学们,大家下午好!  欢迎来到天津师范大学新闻传播...