替代例項一旦被設定屬性或方法,則將自動返回非null值。例如,任何屬性或方法如果返回介面、委託或純虛類*,則將自動的返回替代例項自身。通常這被稱為遞迴模擬技術,而且是非常實用的。比如其可以避免顯式地設定每個替代例項,也就意味著更少量的**。諸如string和array等型別,缺省會返回空值而不是null。
*注:乙個純虛類是指乙個類,其所有的公有方法和屬性都被定義為virtual或abstract,並且其具有乙個預設公有或受保護地無參建構函式。
比如說我們有如下型別定義:
1public
inte***ce
inumberparser25
public
inte***ce
inumberparse***ctory
6
我們想配置 inumberparse***ctory 來建立乙個解析器,該解析器會為乙個 expression 返回一定數量的 int 型別的值。我們可以手工建立每個替代例項:
1[testmethod]
2public
void
test_autorecursivemocks_manuallycreatesubstitutes()3);
89var actual = factory.create('
,').parse("
an expression");
10 collectionassert.areequal(new
int , actual);
11 }
或者可以應用遞迴模擬功能,inumberparse***ctory.create() 會自動返回 inumberparser 型別的替代例項。
1[testmethod]
2public
void
test_autorecursivemocks_automaticallycreatesubstitutes()3);
67var actual = factory.create('
,').parse("
an expression");
8 collectionassert.areequal(new
int , actual);
9 }
每次當使用相同引數呼叫乙個被遞迴模擬的屬性或方法時,都會返回相同的替代例項。如果使用不同引數呼叫,則將會返回乙個新的替代例項。
1[testmethod]
2public
void
test_autorecursivemocks_callrecursivelysubbed()3);
67var firstcall = factory.create(','
);8var secondcall = factory.create(','
);9var thirdcallwithdiffarg = factory.create('x'
);10
11assert.aresame(firstcall, secondcall);
12assert.arenotsame(firstcall, thirdcallwithdiffarg);
13 }
注:不會為類建立遞迴的替代
例項,因為建立和使用類可能有潛在的或多餘的***。因此,有必要顯式地建立和返回類的替代例項。
當需要時,我們可以使用遞迴模擬來簡單地設定替代鏈,但這並不是乙個理想的做法。例如:
1public
inte***ce
icontext24
}5public
inte***ce
irequest
68 iidentity newidentity(string
name);9}
10public
inte***ce
iidentity
1113
string
roles();
14 }
如果要獲取 currentrequest 中的 identity 並返回乙個名字,我們可以手工為 icontext、irequest 和 iidentity 建立替代品,然後使用 returns() 將這些替代例項鏈結到一起。或者我們可以使用為屬性和方法自動建立的替代例項。
1[testmethod]
2public
void
test_autorecursivemocks_substitutechains()
3
在這裡 currentreques t是自動返回乙個 irequest 的替代例項,irequest 替代例項會自動返回乙個 iidentity 替代例項。
注:類似於這種設定很長的替代例項鏈,一般被認為是**臭味:我們打破了 law of demeter 原則,物件只應該與其直接關係的臨近物件打交道,而不與臨近物件的臨近物件打交道。如果你寫的測試用例中沒有使用遞迴模擬,設定的過程可能會明顯的變複雜,所以如果要使用遞迴模式,則需要格外的注意類似的型別耦合。
當屬性或方法返回 string 或 array 型別的值時,缺省會返回空或者非 null 值。比如在你僅需要返回乙個物件引用,但並不關心其特定的屬性時,這個功能可以幫你避免空引用異常。
1[testmethod]
2public
void
test_autorecursivemocks_autovalues()
3
NSubstitute完全手冊索引
nsubstitute 是乙個 net mocking 類庫。一直以來,開發者對 mocking 類庫的語法的簡潔性有強烈的渴望,nsubstitute 試圖滿足這一需求。簡單明瞭的語法可以讓我們將重心放在測試本身,而不是糾纏在測試替代例項的建立和配置上。nsubstitute 已嘗試將最常用的操作...
NSubstitute完全手冊索引
nsubstitute 是乙個 net mocking 類庫。一直以來,開發者對 mocking 類庫的語法的簡潔性有強烈的渴望,nsubstitute 試圖滿足這一需求。簡單明瞭的語法可以讓我們將重心放在測試本身,而不是糾纏在測試替代例項的建立和配置上。nsubstitute 已嘗試將最常用的操作...
NSubstitute完全手冊索引
nsubstitute 是乙個 net 單元測試模擬類庫。一直以來,開發者對 mocking 類庫的語法的簡潔性有強烈的需求,nsubstitute 試圖滿足這一需求。簡單明瞭的語法可以讓我們將重心放在測試本身,而不是糾纏在測試替代例項的建立和配置上。nsubstitute 已嘗試將最常用的操作需求...