2016-07-23 11 views
2

カスタムモジュールtokens.jsは、npmリクエストモジュールでリクエストを行う機能を持っています。 入手トークン()機能をカバーするためにをテストリクエストモジュールを再配線でモックする方法は?

'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.jsのDIアプローチについては考えていませんでした。私はこの方法で試してみるよ、ありがとう。 – t1maccapp

+0

https://stackoverflow.com/questions/46952843/mock-module-which-does-not-exist/46954753私は 'meteor/meteor'の場所を模擬したいのですが、一般的には' meteor from 'という流星をインポートします/ meteor'''は 'meteor test'ではなく' npm run mocha-tests'でテストを開始してから存在しません。残念ながら、多くのコードは 'Meteor'環境に依存しています。 – Gobliins

0

実際、リクエストモジュールを模擬する方法が見つかりました。私はrequestMock関数を作るだけです。また、私はそれはそれを可能にし、要求モジュールにラインがあることが判明: module.exportsはの=は、別のオプションは、その依存関係を簡単に構成されているようにコードを再構築することである

関連する問題