一个方便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版本的进程监控

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

上一篇:抬起你的头

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

相关内容

热门资讯

万象更新的意思和造句 万象更新的意思和造句  新的一年开始了,万象更新,每个人都有一个新希望。下面是小编给大家整理的万象更...
首当其冲的意思和造句 首当其冲的意思和造句  导语:中国加入世贸组织后几乎所有行业的企业都面临着国外跨国公司的严峻挑战,汽...
庇护的同义词是有哪些 庇护的同义词是有哪些  包庇 偏护 保护  为更好地掌握这个词语,以下是必不可少是造句:  一、亲情...
羸弱的反义词是什么_羸弱解释... 羸弱,即软弱无力的意思。那么羸弱的反义词是什么呢?请阅读以下文章,跟着unjs小编一起来了解。羸弱的...
用词语餍足造句 用词语餍足造句  餍足拼音  【注音】: yan zu  餍足解释  【意思】:(yànzú)<书>...
用宛如怎么造句子   导语:春雨来了,细细柔柔的,宛如一条丝巾拂过脸庞。下面是小编为你整理的用宛如怎么造句子,希望对你...
“既,又”关联词造句 “既,又”关联词造句  1、知识堂既好玩又有趣,既增长知识又能得礼物.  2、字典既是我的无声老师,...
处心积虑的造句 处心积虑的造句  1、某些免费或低价的应用在设计上都会向用户推送广告:其他一些则会处心积虑盗窃用户的...
权利和权力造句 权利和权力造句  权利是一个法律概念,一般指了赋予人们的权力和利益,权力是一个政治概念,一般是指有权...
天涯海角的意思是什么_天涯海... 你知道的什么是天涯海角吗?你会给天涯海角来造句吗?请阅读以下文章,跟着unjs小编一起来学习!天涯海...
虽然然而造句 虽然然而造句(精选50句)  造句子是低年级比较基础的,那应该怎么造句呢?下面是小编精心收集的虽然然...
怎么用勇武来造句 怎么用勇武来造句  1、通过你的努力,你已经让一名勇武的伍基人获得了自由。  2、文职首领的职位多为...
分庭抗礼造句 分庭抗礼造句  分庭抗礼原指宾主相见,分站在庭的两边,相对行礼。现比喻平起平坐,彼此对等的关系。大家...
闭口不言成语造句 闭口不言成语造句  1、为此,我不能再闭口不言,我要吐露我心灵的忧愁,陈述我灵魂的苦楚。  2、当我...
娘造句有哪些 娘造句有哪些  1、娘家造句:我们也可以说,虽然苔丝以前的那番经历暂时把她完全压倒了,但是母亲的娘家...
犹豫的反义词及相关造句 犹豫的反义词及相关造句  人就是一生,其实就是在不断犹豫中成熟的。接下来小编为你带来犹豫的反义词及相...
百炼成钢造句   解放军战士百炼成钢,练就一身杀敌本领。  他身经百战,百炼成钢,是大家公认的号将军。  年轻人只...
弟妹的词语造句 弟妹的词语造句  指懂得并使用字词,按照一定的句法规则造出字词通顺、意思完整、符合逻辑的句子。依据现...
时而时而怎么造句 时而时而怎么造句  导语:时而时而怎么造句呢?小学生因为词汇量有限的缘故,在造句上总会大伤脑筋,其实...
灰浆的造句 灰浆的造句  灰浆拼音  【注音】: hui jiang  灰浆解释  【意思】:(1)石灰、水泥或...