使用jasmine进行单元测试功能时模拟全局对象

时间:2018-04-05 21:46:15

标签: javascript node.js jasmine

我需要为从node.js运行的旧JavaScript脚本编写测试。它有一个全局对象,它在一个函数中初始化,然后从另一个函数访问。我的意思是script.js看起来像:

var object;

function first() {
    object = Initialise.object();
    ...
}

function second() {
    object.doSomething();
    ...
}

我需要为second()函数编写单元测试。我们正在使用茉莉花测试框架,我正在努力为object创建一个模拟(存根)。这是因为我不知道如何从script-spec.js访问它。我试过了

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

testObjectundefined

我对JavaScript的了解有限,对我没有帮助(我有Java背景)。

如何测试second()功能?我知道我可能需要重构/重新设计script.js我可以使用。

2 个答案:

答案 0 :(得分:2)

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

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以获取有关此内容的更多信息。

答案 1 :(得分:1)

如果它是一个全局变量会更容易,你可以做一个global.object = mockObject。它实际上是一个模块级变量,模块实际上只是函数。重新分配object的唯一方法是在script.js中定义的函数,例如

function injectMockObject (mockObject) {
  object = mockObject;
}

您需要添加到script.js