請造訪 NSubstitute 網站以了解更多資訊。
NSubstitute 被設計為 .NET 模擬庫的友善替代品。
它試圖用簡潔的語法來滿足我們對模擬庫的渴望,幫助我們將注意力集中在測試的意圖上,而不是測試替身的配置。我們試圖使最頻繁需要的操作變得明顯且易於使用,使不常見的場景保持可發現和可訪問的狀態,同時盡可能保持自然語言。
非常適合那些剛接觸測試的人,以及那些只想用更少的噪音和更少的 lambda 編寫測試的人。
如果您對 NSubstitute 有疑問、功能請求或回饋,請在我們的專案網站上提出問題。歡迎透過我們的專案網站提出所有問題,但對於「如何」式的問題,您也可以嘗試使用 [nsubstitute] 標籤在 StackOverflow 上提問,這通常會從更大的程式設計社群中得到非常好的答案。如果您的問題還涉及我們團隊可能不熟悉的其他程式庫(例如帶有實體框架的 NSubstitute),那麼 StackOverflow 特別有用。
假設我們有一個基本的計算器介面:
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}
我們可以要求 NSubstitute 建立該類型的替代實例。我們可以要求存根、模擬、偽造、間諜、測試替身等,但是當我們只想替換我們可以控制的實例時,為什麼還要麻煩呢?
_calculator = Substitute . For < ICalculator > ( ) ;
virtual
成員一起正常運作。用非虛擬成員替換類別時要小心。有關詳細信息,請參閱創建替代品。
現在我們可以告訴我們的替代者回傳一個呼叫值:
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;
我們可以檢查我們的替代者是否接到了電話,並且沒有接到其他人的電話:
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;
如果我們的 Received() 斷言失敗,NSubstitute 會嘗試為我們提供一些關於問題可能是什麼的幫助:
NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
Add(1, 2)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
Add(1, *5*)
Add(*4*, *7*)
我們也可以使用用於方法的 Returns 語法來處理屬性,或只使用普通的舊屬性設定器(用於讀取/寫入屬性):
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
NSubstitute 支援參數匹配來設定返回值並斷言已收到呼叫:
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;
我們可以使用參數匹配以及將函數傳遞給 Returns() 來從我們的替代品中獲得更多行為(可能太多,但這是你的決定):
_calculator
. Add ( Arg . Any < int > ( ) , Arg . Any < int > ( ) )
. Returns ( x => ( int ) x [ 0 ] + ( int ) x [ 1 ] ) ;
Assert . That ( _calculator . Add ( 5 , 10 ) , Is . EqualTo ( 15 ) ) ;
Returns() 也可以使用多個參數來調用,以設定返回值序列。
_calculator . Mode . Returns ( "HEX" , "DEC" , "BIN" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "BIN" ) ) ;
最後,我們可以在替代項上引發事件(不幸的是,C# 極大地限制了此語法可以清理的程度):
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ;
NSubstitute 及其測試可以使用 Visual Studio、Visual Studio Code 或任何其他支援 .NET 的編輯器進行編譯和運行。請注意,某些測試被標記為[Pending]
,目前並不意味著要通過,因此最好從測試運行中排除 Pending 類別中的測試。
./build
目錄中還有用於命令列建置的建置腳本,以及專案根目錄中的 CI 配置。
要進行完整的構建,您還需要 Ruby,因為 jekyll gem 用於生成網站。
@fluffy-spoon/substitute
)