模块化 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>

更新于: 2022-12-12

286 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.