代码之家  ›  专栏  ›  技术社区  ›  blekione

用jasmine进行单元测试函数时模拟全局对象

  •  1
  • blekione  · 技术社区  · 6 年前

    我需要为运行于 node.js 。它有一个全局对象,该对象在一个函数中初始化,然后从另一个函数访问。我是说 script.js 看起来像:

    var object;
    
    function first() {
        object = Initialise.object();
        ...
    }
    
    function second() {
        object.doSomething();
        ...
    }
    

    我需要为 second() 作用我们正在使用jasmine测试框架,我正在努力为 object .因为我不知道如何从 script-spec.js .我试过了

    var script = require("../src/script.js");
    var testObject = script.object;
    

    但是 testObject undefined

    我的知识 JavaScript 是有限的,这对我也没有帮助(我有 Java 背景)。

    如何进行测试 第二() 作用我知道我可能需要重构/重新设计 剧本js公司 我同意。

    2 回复  |  直到 6 年前
        1
  •  2
  •   blekione    6 年前

    我会重写代码,使其更具功能性:

    function first() {
        return Initialise.object();
    }
    
    function second(object) {
        object.doSomething();
        ...
    }
    

    之后使用代码时:

    var object = first()
    second(object)
    

    然后,模拟变得非常简单,因为您可以控制作为参数传递给 second 在测试中。

    退房 Avoid Side Effects in the Clean Code Javascript repo 有关此的更多信息。

        2
  •  1
  •   generalhenry    6 年前

    如果它是一个全局变量,就更容易了 global.object = mockObject 。它实际上是一个模块级变量,模块实际上只是函数。重新分配的唯一方法 object 来自脚本中定义的函数。js,如

    function injectMockObject (mockObject) {
      object = mockObject;
    }
    

    您需要将其添加到脚本中。js公司