簡體   English   中英

如何使用重新連接模擬請求模塊?

[英]How to mock request module with rewire?

我有一個自定義模塊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);
  });
});

我想編寫單元測試來覆蓋getToken()函數,但是我遇到了一些模擬請求模塊的麻煩。

我試過這個:

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))的情況下工作 我該如何使用重新連線呢?

另一種選擇是重構代碼,以便輕松配置其依賴關系。

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);

有許多策略可以使您的類可配置,並允許有機會注入假對象進行測試。 我相信努力編寫可測試性代碼應該可以消除為項目添加更多第三方依賴項的需要。

實際上,我找到了一種模擬請求模塊的方法。 我只是讓requestMock成為一個函數。 另外我發現在請求模塊中有一行,這使得它成為可能: module.exports = request

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM