NSubstitute完全手冊(十五)自動遞迴模擬

2021-09-06 09:51:34 字數 2795 閱讀 7699

替代例項一旦被設定屬性或方法,則將自動返回非null值。例如,任何屬性或方法如果返回介面、委託或純虛類*,則將自動的返回替代例項自身。通常這被稱為遞迴模擬技術,而且是非常實用的。比如其可以避免顯式地設定每個替代例項,也就意味著更少量的**。諸如string和array等型別,缺省會返回空值而不是null。

*注:乙個純虛類是指乙個類,其所有的公有方法和屬性都被定義為virtual或abstract,並且其具有乙個預設公有或受保護地無參建構函式。

比如說我們有如下型別定義:

1

public

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 }

注:不會為類建立遞迴的替代

例項,因為建立和使用類可能有潛在的或多餘的***。因此,有必要顯式地建立和返回類的替代例項。

當需要時,我們可以使用遞迴模擬來簡單地設定替代鏈,但這並不是乙個理想的做法。例如:

1

public

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 已嘗試將最常用的操作需求...