2017-01-22 12 views
0

** Обновить. На комментарий ниже пример использования может быть неясным. Чтобы расширить, в моем модуле приложения foo() вызывает bar(), который выполняет некоторую сложную логику и возвращает логическое значение. Я создаю модульные тесты (Mocha) и пытаюсь перепрофилировать метод foo() с помощью rewire, поэтому я могу передать true/false обратно в bar() без фактического вызова bar.Используйте команду rewire to stub в анонимном экспорте в NodeJS

Пытается заглушить (aka rewire) метод 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

Вы можете получить лучшую помощь, если вы объясните, что вы пытаетесь достичь. «rewire() метод bar() внутри анонимной функции» не является значимым объяснением (по крайней мере для меня). Что вы на самом деле пытаетесь достичь? Каков желаемый конечный результат? – jfriend00

+0

В моем приложении bar() делает намного больше логики и вызывает другие функции, но конечным результатом является то, что он возвращает true или false. Я пытаюсь заглушить функцию bar() в моем тестовом наборе, чтобы я мог вернуть true/false в разных тестовых сценариях. Функция rewire() используется в Mocha для проверки функциональности foo() без вызова логики в bar(). Имеют смысл? – tagyoureit

ответ

0

Я нашел обходное решение. Моя первоначальная цель состояла в том, чтобы проверить foo() и stub bar(), чтобы я мог контролировать параметр результатов/тестирования. Было бы здорово, если бы кто-нибудь смог придумать лучшее решение.

При таком подходе каждый отдельный вызов функции и функции необходимо будет обрезать/переустановить. Это нормально для моего тестирования, но может оказаться невыполнимым для всех решений.

Мой обходной путь является:

  1. Написать функцию Foo() во временный файл. (При тестировании этот должен/должен быть выполнен в блоке before()).

  2. Проверьте функцию как автономную функцию.

  3. Удалить тестовый временный файл.

Вот код 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')