在NodeJS中的匿名导出中使用重新连接到存根函数

时间:2017-01-22 06:07:51

标签: node.js anonymous-function

**更新。根据下面的评论,用例可能并不清楚。 要扩展,在我的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(),因此它内部的逻辑不会被调用。

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。我最初的目标是测试foo()和stub bar(),这样我就可以控制结果/测试参数。如果有人能提出更好的解决方案,那就太棒了。

在这种方法中,每个变量和函数调用都需要存根/重新连接。这对我的测试没有问题,但对所有解决方案都不可行。

我的解决方法是:

  1. 将foo()函数写入临时文件。 (在测试中,这个 应该/可以在before()块中完成。

  2. 将该功能作为独立功能进行测试。

  3. 删除测试临时文件。

  4. 这里是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')