2012-10-19 5 views
3

Node.js 응용 프로그램에서 nodeunit 함수를 스텁하려고합니다. 나는이 때 때문에, 제대로 request을 무시하지 것 같은node.js의 다른 모듈에서 함수 재정의

var file = require('../lib/file'); 

exports['test myFunc'] = function (test) { 
    request = function(options, callback){ 
     callback('testbody'); 
    }; 

    file.myFunc('something', function(err, body){ 
     test.equal(body, 'testbody'); 
     test.done(); 
    }); 
}; 

것 같다 :

lib/file.js에서 :

var request = require('request'); 

var myFunc = function(input, callback){ 
    request(input, function(err, body){ 
     callback(body); 
    }); 
}; 

test/test.file.js에서 여기에 내가 할 노력하고있어의 단순화 된 버전입니다 테스트를 실행하려고하면 실제 스텁이 아닌 request이 호출되지만 올바른 방법은 무엇인지 알 수 없습니다.

편집 :

위의 내 예제를 아래 일리아의 답변을 확장합니다. lib/file/js에서

:

다음
module.exports = function(requestParam){ 
    return { 
     myFunc: function(input, callback){ 
      requestParam(input, function(err, body){ 
       callback(body); 
      }); 
     } 
    } 
} 

test/test.file.js에서 :

var fakeRequestFunc = function(input, callback){ 
// fake request function 
} 

var file = require('../lib/file')(fakeRequestFunc)(
//test stuff 
} 

답변

3

당신이 발견으로, 하나 개의 모듈에 선언 된 변수는, 쉽게 다른 모듈에서 액세스 할 수 없습니다. 이러한 경우에, 당신은 두 가지 일반적인 변종이 있습니다

1) 함수에 매개 변수를 전달하면 모든 모듈에 필요한 모든 (아닌 경우, 내 생각)

2) 선언

var ab = "foo", 
index = require('/routes/index')(ab); 

때 함수 폼을 모듈이라고 부르면 '요청'이나 다른 변수 나 필요한 객체를 전달할 수 있습니다.

+0

안녕 Ilya, 대답 주셔서 감사합니다,하지만 난 정말 두 번째 줄의 구문을 이해하거나 다른 모듈에서 함수를 스텁이 사용하는 방법. "index = require ('/ routes/index') (ab)는 무엇입니까?" 하기? 위의 예에서 어떻게 사용합니까? – Joe

+0

좋아, 나는 팀의 도움으로 그것을 알아 냈다. 고마워, 다시, 일야! – Joe

2

비슷한 문제가 발생했습니다. 내 솔루션에서 request 모듈 코드를 탐색 한 후 내 솔루션에 request 대신 request.get을 사용했습니다 (정확하게 동일한 작업 수행). 그리고 나서 다음과 같이 테스트 해 보겠습니다 : https://github.com/anatoliychakkaev/resizer-app/blob/master/test/resizer.js#L25

nodejs에서 'require'메소드의 결과를 스텁 할 수도 있습니다. lib/module.js에서 소스를 확인하여이를 수행하는 방법을 관리하십시오. 그래서, (이 공개 API를하지 않습니다)

require('module')._cache['/path/to/request.js'] = your_stub 

그러나이 경우 100 %에서 작동하지 않고 노드의 향후 버전에서 작동하지 않을 수 있기 때문에이 솔루션을 좋아하지 않는다 : 그것은 뭔가를해야한다 다른 방법으로 스텁을 사용할 수없는 경우에만이 방법을 사용해야합니다.