我需要为从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;
但testObject
为undefined
。
我对JavaScript
的了解有限,对我没有帮助(我有Java
背景)。
如何测试second()
功能?我知道我可能需要重构/重新设计script.js
我可以使用。
答案 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