使导入的函数使用新变量

时间:2018-02-11 21:28:35

标签: javascript node.js unit-testing

我尝试将一些单元测试写入我的旧应用之一。 我当时没想到我会想要使用主文件之外的函数,所以我在其中使用了很多局部变量。我的问题是,在导入它们之后,他们试图使用其他范围的变量。有没有办法让他们在不改变旧文件的情况下使用新范围?

\\foo.js

let arr
exports.foo = function foo() {
  return arr[0]
}

\\foo.test.js

let arr = ['bar']
let foo = require('../test/supreme.spec.js').foo
console.log(foo())//undefined, want 'bar'

我明白这可能是一个非常糟糕的做法,但这是一个旧代码,我现在不想乱用它。

3 个答案:

答案 0 :(得分:2)

您可以使用rewire。它是专门为这种情况设计的:

let rewire = require('rewire')

let fooModule = rewire('../lib/foo.js')

fooModule.__set__('arr', [ 'bar' ])
console.log(fooModule.foo()) // bar

答案 1 :(得分:0)

不幸的是,由于函数的闭包和词法环境这样的事情,它是不可能的。该功能记得'与创建的范围相同的所有变量,因此除非它们是该函数的属性,否则它们无法从外部访问。这就是使面向对象的Javascript中的封装成为可能的原因。

答案 2 :(得分:0)

范围与模块隔离,但您可以添加具有默认值的参数。

exports.foo = function foo(arr = ['test data 1', 'test data 2']) {
  return arr[0]
}

然后可以将其称为foo(),也可以称为foo(['other data'])