簡體   English   中英

N僅替代某些類型的自動模擬

[英]NSubstitute auto-mocking certain types only

我注意到NSubstitute會自動修改以下類型:

  • 數組
  • 可觀察的
  • 任務

盡管我知道這種情況會發生,但我找不到選擇這些類型的原因 為什么不讓String null? 還是包括集合而不只是Array

例如:

var crazyInterface = Substitute.For<ICrazyInterface>();

FileInfo[] folderContents = crazyInterface.FolderContents(@"C:\folder");
IObservable<FileInfo> fileObserver = crazyInterface.CreateNewFileObservable();
string fileHash = crazyInterface.FileHash(@"C:\folder\file.txt");
Task<byte[]> fileContents = crazyInterface.ReadFileContentsAsync(@"C:\folder\file.txt");

所有人都為其實現了一個模擬,而List<T>將為null(或任何其他引用類型)。

源代碼未提供有關僅實現AutoValues文件夾中自動裝箱的原因的指示。

簡短的答案:隨着人們的需要,添加了特定的自動模擬類型,我們認為,當期望模擬或default(T)時,返回實際值所帶來的任何混淆都將超過其便利性。


如果有人對此感興趣的話,我記得它是關於此功能演變的更長的,希望是部分准確的故事。

NSubstitute開始返回所有內容的default(T) 對於我們擁有呼叫鏈的情況,這會很痛苦,因此我們為接口類型添加了自動模擬功能。 這是一個相當安全的操作-與類不同,沒有實際代碼可以通過構造函數調用或無意間調用非虛擬方法運行的可能性。 例如, mySub.SomeAutoSub().DoStuff()是否可以基於SomeAutoSub()的返回類型運行真實代碼。

更高級別的安全性是具有所有虛擬成員和默認構造函數的類。 該文檔將這些論文稱為純虛擬類 擁有虛擬成員意味着,如果我們深入研究自動修改實例,就不會意外調用真實代碼。 現在,它仍將通過構造函數運行真實代碼,但是它不帶參數,因此我們可以假設(請讀:交叉手指和希望)默認行為將做明智的事情,而不是可怕的事情。

最后,您指出了一些例外情況,例如ArrayTask 當我們認為方便會超過造成的任何混亂時,會根據反饋完全臨時添加這些內容。 我們要避免的主要事情是在期望模擬時返回真實值。 如果您不小心調用了.Returns ,它將無法正常工作。返回不是模擬的東西。

StringsArraysTasks符合此條件。 您無法模擬這些類型,因此擁有在測試中合理工作的默認值似乎是合理的。 我發現我經常遇到字符串操作,因為默認為null,該字符串操作會崩潰,因此為了方便起見,我添加了一個。 其他人想要一個明智的默認Task ,因此添加了它。 我不記得沒有自動對集合進行分類的原因(可能是因為某些人使用了IList<T>模擬版本,在其中提供像List<T>這樣的特定實現更容易進行顯式存根?)。

我認為我們可以在這里擺脫一些不一致之處,因為我們處於測試的環境中-如果我們需要特定的值或行為,則將其明確地存根。 否則,我們將獲得一個默認值,希望它不會造成任何影響。

如果您希望自動添加其他內容,請ping 討論組 現在要像這樣進行可能具有重大突破的更改會有點困難,但是如果有特殊類型的令人信服的案例,我們可以考慮添加它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM