系列目錄html
使用前面講過的方法基本上可以完成工做中的大部分任務了,然而有些功能實現起來仍是比較麻煩的,好比說字符串相等性比較不區分大小寫,字符串是否匹配某一正則規則,集合中的每個(某一個)元素是否符合特定規則
等,Nunit提供了一些特定的方法用來實現一些用普通斷言比較難以實現的擴展類型和方法.單元測試
此方法用於斷言兩個字符串在不區分大小寫狀況下是否相等,須要提供兩個參數,第一個是期待的結果,第二個是實際結果.這個方法比較簡單,再也不提供示例.測試
須要注意的是Nunit裏有許多須要提供兩個參數的方法,通常狀況下都是第一個是期待的結果,第二個是實際結果ui
用於斷言一個字符串是否包含另外一字符串,其中第一個參數爲被包含的字符串,第二個爲實際字符串,這個方法語義不是特別明確,須要注意code
[Test] public void DemoTest() { StringAssert.Contains("hello", "hello,world"); }
這段代碼片斷會返回成功htm
用於斷言字符串是否以某(幾)字符開始對象
[Test] public void DemoTest() { StringAssert.StartsWith("h", "hello,world"); }
與StringAssert.StartsWith相似,string類也有此方法,相信你們都比較熟悉blog
用於斷言指定字符串是否匹配某一正則規則element
[warning]這個方法並無大小寫開關字符串
下面介紹兩個與
文件(目錄)
有關的斷言類FileAssert和DirectoryAssert.兩個類下面的斷言方法基本同樣,只是一個是斷言文件,一個是斷言目錄.下面以FileAssert爲例說明
這個方法用於斷言兩個文件是不是同一個文件,接受字符串參數
須要說明的是,字符串路徑必須指向文件,而不能是目錄或者不存在的文件.
FileAssert.Exists
用於斷言某個文件是否存在,接受字符串參數
或者FileInfo
做爲參數
DirectoryAssert方法相似,而且這些方法都對應的有相反方向的斷言,方法名包含Not,很容易理解
單元測試過程當中,咱們不少時候都要處理集合,Nunit裏提供了一個 CollectionAssert 類用於處理對集合類型的斷言
下面介紹一下這個類下面的斷言方法
CollectionAssert.AllItemsAreInstancesOfType
用於斷言集合裏面的元素是否都是某一特定類型.
[Test] public void DemoTest() { ArrayList ar = new ArrayList {"a", "b", "c"}; CollectionAssert.AllItemsAreInstancesOfType(ar, typeof(string)); }
以上斷言會返回成功,由於咱們向ArrayList裏添加的全是string類型的元素
須要注意,不少斷言方法第一個參數是期待類型,第二個是實際類型,而此方法則相反,第一個是實際集合,第二個是期待的類型
這裏的類型支持父類,好比說若是是
typeof(object)
也一樣能經過,語義上來說,元素是string類型,也是object類型,講得通的
用於斷言集合裏的元素所有不是Null,也即集合不包含null元素,這個方法只有一個參數,傳入咱們要判斷的集合便可
用於斷言集合裏面的元素所有是唯一的,即集合裏沒有重複元素.
[warning]須要注意的是,這個方法並無提供一個重載支持自定義比較器,它只能用於斷言簡單類型,如string,int,datetime等是否唯一,若是是類類型則須要重載
equals
和gethashcode
可是一般咱們並不這樣作,而是在類外部提供一個比較器,若是判斷複雜類型是否唯一,咱們在之後再介紹
下面舉一個例子說明這個問題
[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); }
以上代碼測試會經過,由於兩個new出來的Persn不是同一個對象,但實際業務中,兩個對象的屬性徹底相等時咱們就認爲它們是相等的,以上咱們期待的結果是 不經過
用於斷言兩個集合是否相等,若是兩個集合裏的元素都是簡單對象,若是是複雜對象用這個方法並非很方便(雖然此方法提供提供IComparer做爲參數,然而IComparer對集合並非很方便)
[warning]這裏的兩個集合相等第一集合元素個數必須相等(不用多說),第二集合元素的
順序必須一致的
還有一點須要說明還有一點須要說明,如以上所說,兩個集合元素順序一致,而且在運行時類型是一致的就會被認爲是相等,這兩個集合的
類型沒必要同樣
,好比說一個是array,一個是list,泛型參數也沒必要須同樣
只要在運行時類型是一致的便可
請看下面一段代碼
[Test] public void DemoTest() { int[] a = {3, 4, 5}; List<object> b =new List<object> {3, 4, 5}; CollectionAssert.AreEqual(a, b); }
a和b兩個集合的集合類型不同,泛型類型也不同,可是運行的時候倒是同樣的,所以以上代碼執行會返回成功狀態
這個方法用來判斷兩個集合的元素是否等價,若是兩個集合元素類型相同,個數也相同,即視爲等價,與上面的方法相比,它不關心順序
[Test] public void DemoTest() { int[] a = {3, 4, 5}; List<object> b =new List<object> {4,3, 5}; CollectionAssert.AreEquivalent(a, b); }
以上代碼測試是經過的
用於斷言集合是否包含某一元素
須要說明的是.要判斷集合中是否包含某一元素,只要集合運行時有特定元素和指定元素類型相同,而且值相同,即認爲集合包含這一元素
請看如下代碼片斷
[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類型元素,只有object類型的值爲4的元素,然而它在運行時真正的類型是int,所以以上測試也是經過的.
用於斷言某一集合是空集合,即元素個數爲0
用於斷言集合元素是否按正序排列,所謂正序列,是指按阿拉伯數字或者字符表順序正序排列.
用於判斷一個集合是否爲另外一個集合的子集,與以上相同的是,這兩個集合沒必要是同一類集合(能夠一個是array,一個是list),只要一個集合的元素徹底包含在另外一個集合中,即認爲它是另外一個集合的子集
只要一個集合元素徹底包含在另外一個集合中便可,順序沒必要相同
用於斷言一個集合是不是另外一個集合的父集,與子集判斷用法同樣.
以上大部分方法都有一個判斷相反的方法,名稱中多一個Not,這裏再也不羅列