unit-testing angular單元測試 - 什麼是嘲笑?




karma (8)

嘲諷類型的目的是為了將測試與特定單元隔離開來,從而切斷依賴關係。 存根是簡單的代理,而嘲笑是可以驗證使用情況的代理。 模擬框架是一個工具,可以幫助您生成存根和嘲笑。

編輯 :由於原來的措辭提到“類型嘲諷”,我得到了這與TypeMock有關的印象。 根據我的經驗,總稱只是“嘲弄”。 請隨時忽略TypeMock上的以下信息。

TypeMock Isolator與其他大多數嘲諷框架不同之處在於它可以在運行中修改IL。 這允許它模擬大多數其他框架無法模擬的類型和實例。 要嘲笑這些類型/實例與其他框架,你必須提供自己的抽象和模擬這些。

TypeMock以一個乾淨的運行時環境為代價提供了極大的靈活性。 作為TypeMock實現其結果的副作用,使用TypeMock時有時會得到非常奇怪的結果。

什麼是嘲笑? 。


模擬正在生成模擬真實對象行為以進行測試的偽對象


其他答案解釋了嘲笑是什麼。 讓我以一個例子來引導你。 相信我,這實際上比你想像的要簡單得多。

tl; dr它是原始類的一個子類。 它還注入了其他數據,因此您可以避免測試注入的部分,並專注於測試其餘代碼。

假設您正在編寫iOS應用程序並進行網絡調用。 您的工作是測試您的應用程序。 測試/確定網絡通話是否按預期工作並不是您的責任。 另一方(服務器團隊)負責測試它。 您必須刪除此(網絡)依賴關係,然後繼續測試您的所有代碼。

網絡調用可以用JSON響應返回不同的狀態碼404,500,200,303等。

你的應用程序假設為所有人工作(如果出現錯誤,你的應用程序應該拋出預期的錯誤)。 你用嘲諷做的事情就是創建'假想 - 類似於真實的'網絡響應(就像帶有JSON文件的200個代碼),並且不用 '進行真正的網絡調用並等待網絡響應'來測試你的代碼。 您可以針對各種網絡響應手動硬編碼/返回網絡響應,並查看您的應用是否按預期工作。 (你從來不會假設/測試一個包含不正確數據的200,因為這不是你的責任,你的責任是用一個正確的200測試你的應用程序,或者如果你的應用程序引發了正確的錯誤,則測試400,500)

這種創造想像 - 類似於真實被稱為嘲弄。

為了做到這一點,你不能使用你的原始代碼(你的原始代碼沒有預先插入的響應,對吧?)。 你必須添加一些東西,注入/插入通常不需要的虛擬數據(或你班級的一部分)。

所以你SUBCLASS原始類,並添加你需要的任何(這裡是網絡HTTPResponse,數據或者在失敗的情況下,你傳遞正確的errorString,HTTPResponse),然後'測試子類',即模擬類。
你不再測試原始類。 模擬/子類是代表原始類進行測試的

長話短說,嘲弄是為了簡化限制你正在測試的內容,並且讓你提供一個班級依賴的東西。 在這個例子中,你避免自己 測試 網絡調用 ,而是測試你的應用程序是否像你期望的那樣使用注入輸出/響應 - 通過mocking

不用說,您可以分別測試每個網絡響應。

僅適用於iOS開發人員:

嘲笑的一個非常好的例子是Natasha Muraschev的這個實用的面向協議的談話。只需跳到18:30分鐘。

我真的很喜歡這部分內容:

因為這是測試...我們確實要確保Gettableget函數被調用, 因為它可以返回,並且函數可以理論上從任何地方分配一組食物 。 我們需要確保它被稱為;


如果你的模擬涉及網絡請求,另一種選擇是有一個真正的測試服務器。 您可以使用此服務為您的測試生成請求和響應。 http://testerurl.com/


模擬是一種以受控方式模擬真實方法/對象行為的方法/對象。 模擬對像用於單元測試。

通常,測試下的方法會調用其中的其他外部服務或方法。 這些被稱為依賴關係。 一旦被嘲笑,依賴就像我們定義它們的方式一樣。

通過mock控制依賴關係,我們可以輕鬆測試我們編寫的方法的行為。 這是單元測試。

模擬對象的目的是什麼?

嘲笑vs存根

單元測試與功能測試


SO上有很多答案,網上關於嘲笑的好帖子。 你可能想開始尋找的一個地方是Martin Fowler Mocks不是存根(Stubs) ,他討論了很多嘲笑的想法。

在一段中 - 模擬是一種特殊的技術,它允許測試代碼單元而不依賴於依賴關係。 一般來說,區別於其他方法的嘲笑是用來代替代碼依賴關係的模擬對象將允許設置期望 - 模擬對象將知道它是如何被代碼調用以及如何響應的。

你原來的問題提到了TypeMock,所以我把答案留在下面:

TypeMock是商業模擬框架的名稱。

它提供了RhinoMocks和Moq等免費模擬框架的所有功能,以及一些更強大的選項。

無論你是否需要TypeMock都是非常值得商榷的 - 你可以用免費的嘲諷庫來做大多數嘲笑,許多人認為TypeMock提供的功能通常會讓你遠離封裝好的設計。

正如另一個回答所說'TypeMocking'實際上並不是一個定義的概念,但可以被認為是TypeMock提供的嘲笑類型,它使用CLR探查器在運行時攔截.Net調用,賦予偽對象更多的能力(而不是要求如需要接口或虛擬方法)。


序言:如果你在字典中查找名詞模擬 ,你會發現這個詞的定義之一是模仿

嘲笑主要用於單元測試。 被測對象可能依賴於其他(複雜)對象。 要隔離要測試的對象的行為,請使用模擬實際對象行為的模擬替換其他對象。 如果真實對像不適合納入單元測試,這很有用。

簡而言之,嘲諷正在創造模擬真實物體行為的物體。

有時你可能想區分嘲笑而不是嘲笑 。 關於這個主題可能會有一些分歧,但我對存根的定義是一個“最小”的模擬對象。 存根實現足夠的行為以允許被測對象執行測試。

模擬就像一個存根,但測試也將驗證被測對像如預期的那樣調用模擬。 部分測試正在驗證模擬使用是否正確。

舉個例子:你可以通過實現一個簡單的內存結構來存儲記錄來存根數據庫。 被測試的對象然後可以讀取和寫入記錄到數據庫存根以允許它執行測試。 這可以測試與數據庫無關的對象的某些行為,並且僅包含數據庫存根才能讓測試運行。

如果您不想驗證被測對象將某些特定數據寫入數據庫,則必須模擬數據庫。 然後,您的測試將包含關於寫入數據庫模擬內容的斷言。


嘲笑的最佳解決方案是讓機器通過基於規格的自動化測試來完成所有工作。 對於Java,請參閱Functional Java庫中包含的ScalaCheckReductio框架。 使用基於規範的自動化測試框架,您可以提供被測方法的規範(關於它的屬性應該是真實的),框架自動生成測試以及模擬對象。

例如,以下屬性測試Math.sqrt方法以查看n平方的任何正數的平方根是否等於n。

val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }

當你調用propSqrt.check() ,ScalaCheck會生成數百個整數並檢查你的每個屬性,同時自動確保邊緣案例被覆蓋。

儘管ScalaCheck是用Scala編寫的,並且需要Scala編譯器,但使用它測試Java代碼很容易。 Functional Java中的Reductio框架是相同概念的純Java實現。







unit-testing mocking