**更新。根据下面的评论,用例可能并不清楚。
要扩展,在我的app模块中,foo()调用bar(),它执行一些复杂的逻辑并返回一个布尔值。我正在创建单元测试(Mocha)并尝试使用rewire
重新连接foo()方法,因此我可以将true / false传回bar()而不实际调用bar。
尝试在匿名函数中存根(也称为重新连接)bar()方法。可能吗?在尝试了不同的方法后,我无法看到如何覆盖bar()。
//foobar.js
module.exports = function(config) {
function bar() {
console.log('why am i in _%s_ bar?', config)
//some logic
return true
}
function foo() {
if (bar()) {
console.log('should not get here, but someVar is passing: ', someVar)
return true
} else {
console.log('should get here, though, and we still see someVar: ', someVar)
return false
}
}
return {
foo: foo,
bar: bar
}
}
和
//rewire_foobar.js
var rewire = require('rewire')
var myModule = rewire(__dirname + '/foobar.js')
myModule.__with__({
'bar': function(){
console.log('changing return to false from rewire')
return false
},
'someVar': "abcde"
})(function() {
var result = myModule('a').foo()
console.log('result is: ', result)
})
给出结果
why am i in _a_ bar?
should not get here, but someVar is passing: abcde
result is: true
someVar
正在通过。但是我需要重新连接bar(),因此它内部的逻辑不会被调用。
答案 0 :(得分:0)
我找到了解决方法。我最初的目标是测试foo()和stub bar(),这样我就可以控制结果/测试参数。如果有人能提出更好的解决方案,那就太棒了。
在这种方法中,每个变量和函数调用都需要存根/重新连接。这对我的测试没有问题,但对所有解决方案都不可行。
我的解决方法是:
将foo()函数写入临时文件。 (在测试中,这个 应该/可以在before()块中完成。
将该功能作为独立功能进行测试。
删除测试临时文件。
这里是foobar.spec.js的代码:
var rewire = require('rewire')
var foobar = require('./foobar.js')
var fs = require('fs')
//extracts the function to test and exports it as temp()
//could be done in a before() block for testing
var completeHack = 'exports.temp = ' + foobar().foo.toString()
//write the function to a temporary file
fs.writeFileSync(__dirname + '/temp.js', completeHack , 'utf8')
//rewire the extracted function
var myModule = rewire(__dirname + '/temp.js')
myModule.__with__({
//and stub/rewire and variables
'bar': function(){
console.log('changing return to false from rewire')
return false
},
'someVar': "abcde",
'config': 'not really important'
})(function() {
//and test for our result
var result = myModule.temp()
console.log('result is: ', result)
})
//and finally delete the temp file. Should be put in afterEach() testing function
fs.unlinkSync(__dirname + '/temp.js')