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

Mocking a global object when unit testing function with jasmine

提问人:blekione 提问时间:4/6/2018 更新时间:4/7/2018 访问量:1275

问:

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

var object;

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

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

我需要为函数编写一个单元测试。我们正在使用一个茉莉花测试框架,我正在努力为 .这是因为我不知道如何从 .我试过了second()objectscript-spec.js

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

但是是.testObjectundefined

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

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

JavaScript node.js 茉莉花

评论


答:

1赞 generalhenry 4/6/2018 #1

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

function injectMockObject (mockObject) {
  object = mockObject;
}

您需要将其添加到script.js

2赞 Bryan Downing 4/6/2018 #2

我会重写代码以使其功能更强大:

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

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

然后稍后使用代码时:

var object = first()
second(object)

然后模拟变得非常微不足道,因为你可以控制在测试中作为参数传递的内容。second

有关此内容的详细信息,请查看 Clean Code Javascript 存储库中的避免副作用