2016-07-23 2 views
2

사용자 지정 모듈 tokens.js요청 모듈을 통해 요청을하는 기능이 있습니다. getToken() 기능을 다루을 테스트요청 모듈을 재선으로 모의하는 방법은 무엇입니까?

'use strict'; 

let request = require('request'); 

module.exports.getToken = function(code, cb) { 
    let url = 'some_url'; 

    request(url, function (err, response, body) { 
    if (err) { 
     return cb(err); 
    } else if (response.statusCode !== 200) { 
     return cb('err'); 
    } 

    parseGetResponse(body, function (err, token) { 
     if (err) { 
     return cb(err); 
     } 

     return cb(null, token); 
    }); 
}); 

내가 단위를 쓰고 싶습니다,하지만 난 요청 모듈을 조롱하는 몇 가지 문제가 있습니다 그것은 다음과 같습니다.

let mocha = require('mocha'); 
let rewire = require('rewire'); 
let should = require('should'); 

let requestMock = { 
    request: function (url, cb) { 
     // return cb(); etc 
    } 
} 

let tokens = rewire('services/tokens.js'); 
tokens.__set__('request', requestMock); 

그러나이 방법이 작동하지 않습니다 :

TypeError: request is not a function 
    at Object.module.exports.getToken (services/tokens.js) 

사실, 다른 질문에 리드 :

나는이 시도 어떻게 요청 모듈 수도 직접 수출 부르심 기능이없는 작품 (request.request (url, cb))? 그리고 이것으로 어떻게 재 연결해야합니까?

답변

1

를 요청합니다.

function TokenGetter(request) { 
    this.request = request || require('request'); 
    this.getToken = function(code, cb) { ... 
} 
module.exports.TokenGetter = TokenGetter; 

// production code 
var tokenGetter = new TokenGetter(); 

테스트 코드

// test code can configure a mock request for your test, no 
// 3rd party libraries 
// configure mockObject with assertions/return values 
var mockRequest = function(url, cb) { .... ; 

var testTokenGetter = new TokenGetter(mockRequest); 

테스트를 위해 가짜 객체를 삽입 할 수있는 기회를 당신의 클래스를 구성하고, 그리고 수 많은 전략이있다. 테스트 가능성을위한 코드를 작성하려고 노력하면 프로젝트에 더 많은 타사 종속성을 추가 할 필요가 없어집니다.

+0

node.j에서 DI 접근 방식에 대해 생각조차하지 않았습니다. 나는이 방법을 시도 할 것이다, 고마워. – t1maccapp

+0

https://stackoverflow.com/questions/46952843/mock-module-which-does-not-exist/46954753 '유성/유성'위치를 조롱하고 싶거나 일반적으로 유성 가져 오기 유성을 유추하고 싶습니다/meteor'''는 유성 테스트가 아닌'npm run mocha-tests'로 테스트를 시작한 이후로 존재하지 않습니다. 불행하게도 많은 코드가'Meteor' 환경에 의존하고 있습니다. – Gobliins

0

실제로 요청 모듈을 모의 할 수있는 방법을 찾았습니다. 나는 단지 requestMock 함수를 만든다. 또한 나는 그 것을 가능하게 요청 모듈 라인이 있음을 발견 : module.exports의 = 또 다른 옵션은 종속 쉽게 구성되도록 코드를 구조 조정하는 것입니다

관련 문제