gpt4 book ai didi

node.js - 如何用 rewire 模拟请求模块?

转载 作者:搜寻专家 更新时间:2023-10-31 23:59:55 26 4
gpt4 key购买 nike

我有一个自定义模块 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))?我应该如何使用 rewire 呢?

最佳答案

另一种选择是重构代码,以便轻松配置其依赖项。

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

有许多策略可以使您的类可配置,并允许有机会注入(inject)假对象进行测试。我相信努力编写可测试性代码应该消除向项目添加更多第 3 方依赖项的需要。

关于node.js - 如何用 rewire 模拟请求模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38541049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com