我使用第三方restful服务发送短信验证码。我为它写了一个单元测试。但是,每次运行单元测试时,我都不希望收到消息。
代码如下:
const _request = require("request");
_request({
method: "POST",
url: "http://blah.com/json",
form: {
apikey: "blah",
mobile: input.mobilePhoneNumber,
text: `code is: ${verificationCode}`,
}
}, (err, res, body) => {
if (err) {
dbg(`end, output=${err}`)
return reject(new Error("something wrong"))
} else {
dbg(`end, output=${res}`)
return resolve({})
}
})
在测试中我使用sinon.stub
sinon.stub(request, "post").returns(Promise.resolve({}))
然而,这个存根并没有真正抓住" post"请求中的方法。我查看了源代码并尝试了很多方法(比如存根构造函数),但没有一个工作。
想知道以前是否有人试过这个。如何按要求存根这个帖子方法?
谢谢!
答案 0 :(得分:4)
您的代码没有调用request.post()
,因此将其删除将无法捕获您正在进行的调用。
相反,你需要对request
函数本身进行存根,这对单独使用Sinon很难,因为它需要一个“父”对象,它可以替换/存根方法/函数。
您可以使用proxyquire
解决这个问题,您可以使用that other answer you linked来“捕获”request
的导入并将其替换为存根:
const sinon = require('sinon');
const request = require('request');
const proxyquire = require('proxyquire');
let stub = sinon.stub();
const mod = proxyquire('./your-module', { request : stub });
在您的测试用例中,您可以使stub
屈服于您传递的回调:
let fakeError = null;
let fakeResponse = {};
let fakeBody = '';
stub.reset();
stub.yields(fakeError, fakeResponse, fakeBody);
yields
的参数代表代码中的err
,res
和body
。您可以传递各种组合来检查您的代码是否正确处理了响应。
调用stub.reset()
的原因是你需要在每次测试之前确保存根被重置为原始状态(因此它开始“新鲜”)。