使用前面講過的方法基本上能夠完成工作中的大部分任務了,然而有些功能實現起來還是比較麻煩的,比如說字符串相等性比較不區分大小寫,字符串是否匹配某一正則規則,集合中的每一個(某一個)元素是否符合特定規則
等,Nunit提供了一些特定的方法用來實現一些用普通斷言比較難以實現的擴展類型和方法.
下面介紹一下StringAssert類型下面的方法
StringAssert.AreEqualIgnoringCase(string expected,string actual)
此方法用於斷言兩個字符串在不區分大小寫情況下是否相等,需要提供兩個參數,第一個是期待的結果,第二個是實際結果.這個方法比較簡單,不再提供示例.
需要注意的是Nunit里有許多需要提供兩個參數的方法,一般情況下都是第一個是期待的結果,第二個是實際結果
StringAssert.Contains
用於斷言一個字符串是否包含另一字符串,其中第一個參數為被包含的字符串,第二個為實際字符串,這個方法語義不是特別明確,需要注意
[Test]
public void DemoTest()
{
StringAssert.Contains("hello", "hello,world");
}
這段代碼片段會返回成功
StringAssert.StartsWith
用於斷言字符串是否以某(幾)字符開始
[Test]
public void DemoTest()
{
StringAssert.StartsWith("h", "hello,world");
}
StringAssert.EndsWith
與StringAssert.StartsWith類似,string類也有此方法,相信大家都比較熟悉
StringAssert.IsMatch
用於斷言指定字符串是否匹配某一正則規則
[warning]這個方法並沒有大小寫開關
下面介紹兩個與
文件(目錄)
有關的斷言類FileAssert和DirectoryAssert.兩個類下面的斷言方法基本一樣,只是一個是斷言文件,一個是斷言目錄.下面以FileAssert為例說明
FileAssert.AreEqual
這個方法用於斷言兩個文件是否是同一個文件,接受字符串參數
需要說明的是,字符串路徑必須指向文件,而不能是目錄或者不存在的文件.
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類型,講得通的
CollectionAssert.AllItemsAreNotNull
用於斷言集合里的元素全部不是Null,也即集合不包含null元素,這個方法只有一個參數,傳入我們要判斷的集合即可
CollectionAssert.AllItemsAreUnique
用於斷言集合里面的元素全部是惟一的,即集合里沒有重復元素.
[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不是同一個對象,但實際業務中,兩個對象的屬性完全相等時我們就認為它們是相等的,以上我們期待的結果是 不通過
CollectionAssert.AreEqual
用於斷言兩個集合是否相等,如果兩個集合里的元素都是簡單對象,如果是復雜對象用這個方法並不是很方便(雖然此方法提供提供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兩個集合的集合類型不一樣,泛型類型也不一樣,但是運行的時候卻是一樣的,因此以上代碼執行會返回成功狀態
CollectionAssert.AreEquivalent
這個方法用來判斷兩個集合的元素是否等價,如果兩個集合元素類型相同,個數也相同,即視為等價,與上面的方法相比,它不關心順序
[Test]
public void DemoTest()
{
int[] a = {3, 4, 5};
List<object> b =new List<object> {4,3, 5};
CollectionAssert.AreEquivalent(a, b);
}
以上代碼測試是通過的
CollectionAssert.Contains
用於斷言集合是否包含某一元素
需要說明的是.要判斷集合中是否包含某一元素,只要集合運行時有特定元素和指定元素類型相同,並且值相同,即認為集合包含這一元素
請看以下代碼片段
[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,因此以上測試也是通過的.
CollectionAssert.IsEmpty
用於斷言某一集合是空集合,即元素個數為0
CollectionAssert.IsOrdered
用於斷言集合元素是否按正序排列,所謂正序列,是指按阿拉伯數字或者字符表順序正序排列.
CollectionAssert.IsSubsetOf
用於判斷一個集合是否為另一個集合的子集,與以上相同的是,這兩個集合不必是同一類集合(可以一個是array,一個是list),只要一個集合的元素完全包含在另一個集合中,即認為它是另一個集合的子集
只要一個集合元素完全包含在另一個集合中即可,順序不必相同
CollectionAssert.IsSupersetOf
用於斷言一個集合是否是另一個集合的父集,與子集判斷用法一樣.
以上大部分方法都有一個判斷相反的方法,名稱中多一個Not,這里不再羅列