模組化 JavaScript 模式下的單元測試挑戰
首先,讓我們瞭解什麼是單元測試以及它如何幫助我們。單元測試是眾多自動化測試型別中的一種。單元測試完全隔離並測試應用程式的相對較小的部分,並將結果與預期結果進行比較。在對應用程式進行單元測試時,通常不會將其連結到外部依賴項,例如資料庫、檔案系統或 HTTP 服務。這被稱為“完全隔離”。由於它們不會因所有這些外部服務的問題而失敗,因此單元測試可以更快且更可靠。
單元測試是一種軟體測試技術,用於檢查單個軟體單元(例如計算機程式模組組、使用場景和操作程式)是否適合使用。這是一種測試策略,開發人員檢查每個單獨的模組是否存在問題。它與獨立模組的功能性相關。
模組是任何健壯應用程式架構的重要組成部分,通常使保持專案的程式碼單元整潔分離和組織變得更容易。
JavaScript 的模組也稱為“ES 模組”或“ECMAScript 模組”。JavaScript 模組是最流行的設計模式。它用於維護各個程式碼片段與其他部分的獨立性。這提供了鬆散耦合,以支援結構良好的程式碼。
在面向物件的語言方面,模組只是 JavaScript 類。封裝是類眾多好處之一,在之前的文章中已突出顯示,它可以防止其他類訪問狀態和行為。模組模式建立了公共和私有訪問級別。
模組必須透過充當閉包來保護方法和變數的 IIFE(立即呼叫函式表示式)來支援私有作用域。
這是一個基本示例,它看起來像這樣。
(function() { // declare private variables and/or functions return { // declare public variables and/or functions } })();
在這種情況下,我們在返回我們打算返回的物件之前建立私有變數和/或函式。由於這些私有變數不屬於與我們的閉包相同的範圍,因此外部程式碼無法訪問它們。
示例
在這個例子中,讓我們瞭解如何以更具體的方式實現它。
<!DOCTYPE html> <html> <title>Unit Testing Challenges with Modular JavaScript Patterns - TutorialsPoint</title> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" countent="IE=edge"> <meta name="viewport" countent="width=device-width, initial-scale=1.0"> </head> <body> <div id="result"></div> <script> function Football(type) { this.type = type; this.country = "italian"; this.getInfo = getFootballInfo; } function getFootballInfo() { return this.country + ' ' + this.type + ' is italian'; } let italian = new Football('language'); italian.country = "players"; document.getElementById("result").innerHTML = (italian.getInfo()); </script> </body> </html>
揭示模組模式
RMP 或揭示模組模式是 Javascript 的一種流行設計模式。其背後的概念是,它將實現細節隱藏在閉包中,並且僅“揭示”那些旨在透過包含函式傳遞的物件文字公開的函式。該模式由 Christian Heilmann 建立,Addy Osmani 在他的著作《學習 Javascript 設計模式》中對其進行了描述。RMP 模式似乎非常適合測試階段,因為它提供了公共 API。
示例 1
揭示模組模式是模組模式的一種變體。在保持封裝的同時,透過物件文字返回的一些變數和方法變得可見。讓我們透過下面的示例來理解。
<!DOCTYPE html> <html> <title>Unit Testing Challenges with Modular JavaScript Patterns - TutorialsPoint</title> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" countent="IE=edge"> <meta name="viewport" countent="width=device-width, initial-scale=1.0"> </head> <body> <div id="resul1"></div> <div id="resul2"></div> <script> let organicFarm = (function() { let privateVariable = 10; let privateFarmingMethod = function() { document.getElementById("resul1").innerHTML = ('These fruits are inside a private farming method!'); privateVariable++; } let organicFarmMethod = function() { document.getElementById("resul2").innerHTML = ('These fruits are from organic farming method!' + '<br>'); } let otherMethodIWantToFarm = function() { privateFarmingMethod(); } return { first: organicFarmMethod, second: otherMethodIWantToFarm }; })(); organicFarm.first(); // Output: These fruits are from oganic farming method! organicFarm.second(); // Output: These fruits are inside a private farming method! organicFarm.organicFarmMethod; // undefined </script> </body> </html>
示例 2
這是 JavaScript 中揭示模組模式的另一個示例
<!DOCTYPE html> <html> <title>Unit Testing Challenges with Modular JavaScript Patterns - TutorialsPoint</title> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" countent="IE=edge"> <meta name="viewport" countent="width=device-width, initial-scale=1.0"> </head> <body> <div id="result"></div> <script> let farmModule = (function() { function fruits() { return 'These fruits are from my farm Module'; } function vegetables() { return 'These vegetables are from organic farming'; } return { fruits: fruits, vegetables: vegetables }; }()); document.getElementById("result").innerHTML = (farmModule.fruits()); // These fruits are from my farm Module </script> </body> </html>