如何在将变量传递给 javascript iffe 时进行测试

How to test when passing a variable into a javascript iffe

如果我想模拟传入的参数 y,如何在 Jasmine 中测试以下 iife javascript? 由于脚本文件在 specs 脚本之前被引用,所以在我可以 mock/spy 对象上的 y 之前立即调用 y 。

我可以在 spec runner html(或什至另一个 js 文件)上创建一个虚拟模拟对象,但这不允许我在每次测试中更改模拟值,因为我无法引用变量 checkObject,因此我无法测试 pass/fail 场景。 我错过了什么吗?

谢谢

文件1.js

var y =  {
   age:25
} 

文件2.js

var helper = (function(checkObject){
  function isValid(itemToCheck){
    return itemToCheck > checkObject.age ;   
  }
   return {isValid:isValid}
})(y);

我明白你想做什么了。我认为你应该重新设计你的代码。当代码的和平不可测试时,这表明设计不佳。 iife 基本上用于创建新的词法范围以防止污染全局范围。在您的情况下,您将 iife 用作对象工厂。一种解决方案是创建一个带有 checkObject 和 return 辅助对象的辅助工厂。

var helperFactory = {}; 

helperFactory.createHelper = function (checkObject){

      function isValid(itemToCheck){
         return itemToCheck > checkObject.age ;   
      }

      return {isValid:isValid}; // this is the helper object returned by the factory
  }

现在您可以测试 helperFactory 和 helper 对象是否可测试。要使用 y 变量,您可以这样做:

var helper = helperFactory.createHelper(y);

记住,iife主要是用来隐藏变量(创建新作用域)的。如果你想隐藏 helperFactory,你必须使用某种机制使这个对象在全局范围内可见。例如,您可以像这样将 helperFactory 附加到 window 全局对象:

(function(){
    window.helperFactory = {}; 
    window.helperFactory.createHelper = function (checkObject){

        function isValid(itemToCheck){
            return itemToCheck > checkObject.age ;   
        }

        return {isValid:isValid}; // this is the helper object returned by the factory
    }
})();
var helper = window.helperFactory.createHelper(y);