系列目錄 <https://www.cnblogs.com/tylerzhou/p/11204826.html>
使用前面講過(guò)的方法基本上能夠完成工作中的大部分任務(wù)了,然而有些功能實(shí)現(xiàn)起來(lái)還是比較麻煩的,比如說(shuō)
字符串相等性比較不區(qū)分大小寫(xiě),字符串是否匹配某一正則規(guī)則,集合中的每一個(gè)(某一個(gè))元素是否符合特定規(guī)則
等,Nunit提供了一些特定的方法用來(lái)實(shí)現(xiàn)一些用普通斷言比較難以實(shí)現(xiàn)的擴(kuò)展類(lèi)型和方法.
下面介紹一下StringAssert類(lèi)型下面的方法
StringAssert.AreEqualIgnoringCase(string expected,string actual)
此方法用于斷言?xún)蓚€(gè)字符串在不區(qū)分大小寫(xiě)情況下是否相等,需要提供兩個(gè)參數(shù),第一個(gè)是期待的結(jié)果,第二個(gè)是實(shí)際結(jié)果.這個(gè)方法比較簡(jiǎn)單,不再提供示例.
需要注意的是Nunit里有許多需要提供兩個(gè)參數(shù)的方法,一般情況下都是第一個(gè)是期待的結(jié)果,第二個(gè)是實(shí)際結(jié)果
StringAssert.Contains
用于斷言一個(gè)字符串是否包含另一字符串,其中第一個(gè)參數(shù)為被包含的字符串,第二個(gè)為實(shí)際字符串,這個(gè)方法語(yǔ)義不是特別明確,需要注意
[Test] public void DemoTest() { StringAssert.Contains("hello",
"hello,world"); }
這段代碼片段會(huì)返回成功
StringAssert.StartsWith
用于斷言字符串是否以某(幾)字符開(kāi)始
[Test] public void DemoTest() { StringAssert.StartsWith("h", "hello,world"); }
StringAssert.EndsWith
與StringAssert.StartsWith類(lèi)似,string類(lèi)也有此方法,相信大家都比較熟悉
StringAssert.IsMatch
用于斷言指定字符串是否匹配某一正則規(guī)則
[warning]這個(gè)方法并沒(méi)有大小寫(xiě)開(kāi)關(guān)
下面介紹兩個(gè)與文件(目錄)
有關(guān)的斷言類(lèi)FileAssert和DirectoryAssert.兩個(gè)類(lèi)下面的斷言方法基本一樣,只是一個(gè)是斷言文件,一個(gè)是斷言目錄.下面以FileAssert為例說(shuō)明
FileAssert.AreEqual
這個(gè)方法用于斷言?xún)蓚€(gè)文件是否是同一個(gè)文件,接受字符串參數(shù)
需要說(shuō)明的是,字符串路徑必須指向文件,而不能是目錄或者不存在的文件.
FileAssert.Exists
用于斷言某個(gè)文件是否存在,接受字符串參數(shù)或者FileInfo作為參數(shù)
DirectoryAssert方法類(lèi)似,并且這些方法都對(duì)應(yīng)的有相反方向的斷言,方法名包含Not,很容易理解
單元測(cè)試過(guò)程中,我們很多時(shí)候都要處理集合,Nunit里提供了一個(gè) CollectionAssert 類(lèi)用于處理對(duì)集合類(lèi)型的斷言
下面介紹一下這個(gè)類(lèi)下面的斷言方法
CollectionAssert.AllItemsAreInstancesOfType
用于斷言集合里面的元素是否都是某一特定類(lèi)型.
[Test] public void DemoTest() { ArrayList ar = new ArrayList {"a", "b", "c"};
CollectionAssert.AllItemsAreInstancesOfType(ar, typeof(string)); }
以上斷言會(huì)返回成功,因?yàn)槲覀兿駻rrayList里添加的全是string類(lèi)型的元素
需要注意,很多斷言方法第一個(gè)參數(shù)是期待類(lèi)型,第二個(gè)是實(shí)際類(lèi)型,而此方法則相反,第一個(gè)是實(shí)際集合,第二個(gè)是期待的類(lèi)型
這里的類(lèi)型支持父類(lèi),比如說(shuō)如果是typeof(object)也同樣能通過(guò),語(yǔ)義上來(lái)講,元素是string類(lèi)型,也是object類(lèi)型,講得通的
CollectionAssert.AllItemsAreNotNull
用于斷言集合里的元素全部不是Null,也即集合不包含null元素,這個(gè)方法只有一個(gè)參數(shù),傳入我們要判斷的集合即可
CollectionAssert.AllItemsAreUnique
用于斷言集合里面的元素全部是惟一的,即集合里沒(méi)有重復(fù)元素.
[warning]
需要注意的是,這個(gè)方法并沒(méi)有提供一個(gè)重載支持自定義比較器,它只能用于斷言簡(jiǎn)單類(lèi)型,如string,int,datetime等是否惟一,如果是類(lèi)類(lèi)型則需要重載
equals和gethashcode但是通常我們并不這樣做,而是在類(lèi)外部提供一個(gè)比較器,如果判斷復(fù)雜類(lèi)型是否惟一,我們?cè)谝院笤俳榻B
下面舉一個(gè)例子說(shuō)明這個(gè)問(wèn)題
[Test] public void DemoTest() { Person[] psn = new Person[] { new Person {
Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)}, new Person {
Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)}};
CollectionAssert.AllItemsAreUnique(psn); }
以上代碼測(cè)試會(huì)通過(guò),因?yàn)閮蓚€(gè)new出來(lái)的Persn不是同一個(gè)對(duì)象,但實(shí)際業(yè)務(wù)中,兩個(gè)對(duì)象的屬性完全相等時(shí)我們就認(rèn)為它們是相等的,以上我們期待的結(jié)果是 不通過(guò)
CollectionAssert.AreEqual
用于斷言?xún)蓚€(gè)集合是否相等,如果兩個(gè)集合里的元素都是簡(jiǎn)單對(duì)象,如果是復(fù)雜對(duì)象用這個(gè)方法并不是很方便(雖然此方法提供提供IComparer作為參數(shù),然而IComparer對(duì)集合并不是很方便)
[warning]這里的兩個(gè)集合相等第一集合元素個(gè)數(shù)必須相等(不用多說(shuō)),第二集合元素的順序必須一致的
還有一點(diǎn)需要說(shuō)明還有一點(diǎn)需要說(shuō)明,如以上所說(shuō),兩個(gè)集合元素順序一致,并且在運(yùn)行時(shí)類(lèi)型是一致的就會(huì)被認(rèn)為是相等,這兩個(gè)集合的類(lèi)型不必一樣
,比如說(shuō)一個(gè)是array,一個(gè)是list,泛型參數(shù)也不必須一樣
只要在運(yùn)行時(shí)類(lèi)型是一致的即可
請(qǐng)看下面一段代碼
[Test] public void DemoTest() { int[] a = {3, 4, 5}; List<object> b =new
List<object> {3, 4, 5}; CollectionAssert.AreEqual(a, b); }
a和b兩個(gè)集合的集合類(lèi)型不一樣,泛型類(lèi)型也不一樣,但是運(yùn)行的時(shí)候卻是一樣的,因此以上代碼執(zhí)行會(huì)返回成功狀態(tài)
CollectionAssert.AreEquivalent
這個(gè)方法用來(lái)判斷兩個(gè)集合的元素是否等價(jià),如果兩個(gè)集合元素類(lèi)型相同,個(gè)數(shù)也相同,即視為等價(jià),與上面的方法相比,它不關(guān)心順序
[Test] public void DemoTest() { int[] a = {3, 4, 5}; List<object> b =new
List<object> {4,3, 5}; CollectionAssert.AreEquivalent(a, b); }
以上代碼測(cè)試是通過(guò)的
CollectionAssert.Contains
用于斷言集合是否包含某一元素
需要說(shuō)明的是.要判斷集合中是否包含某一元素,只要集合運(yùn)行時(shí)有特定元素和指定元素類(lèi)型相同,并且值相同,即認(rèn)為集合包含這一元素
請(qǐng)看以下代碼片段
[Test] public void DemoTest() { int[] a = {3, 4, 5}; object element = 4;
List<object> b =new List<object> {element,3, 5}; CollectionAssert.Contains(b,
4); }
以上代碼段中b集合雖然不包含值為4的int類(lèi)型元素,只有object類(lèi)型的值為4的元素,然而它在運(yùn)行時(shí)真正的類(lèi)型是int,因此以上測(cè)試也是通過(guò)的.
CollectionAssert.IsEmpty
用于斷言某一集合是空集合,即元素個(gè)數(shù)為0
CollectionAssert.IsOrdered
用于斷言集合元素是否按正序排列,所謂正序列,是指按阿拉伯?dāng)?shù)字或者字符表順序正序排列.
CollectionAssert.IsSubsetOf
用于判斷一個(gè)集合是否為另一個(gè)集合的子集,與以上相同的是,這兩個(gè)集合不必是同一類(lèi)集合(可以一個(gè)是array,一個(gè)是list),只要一個(gè)集合的元素完全包含在另一個(gè)集合中,即認(rèn)為它是另一個(gè)集合的子集
只要一個(gè)集合元素完全包含在另一個(gè)集合中即可,順序不必相同
CollectionAssert.IsSupersetOf
用于斷言一個(gè)集合是否是另一個(gè)集合的父集,與子集判斷用法一樣.
以上大部分方法都有一個(gè)判斷相反的方法,名稱(chēng)中多一個(gè)Not,這里不再羅列
熱門(mén)工具 換一換
