edd*_*xie 2 javascript unit-testing request mocha.js sinon
我正在使用第三方宁静服务发送短信验证码。我为它写了一个单元测试。但是,我不希望每次运行单元测试时都收到一条消息。
代码是这样的:
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({})
}
})
Run Code Online (Sandbox Code Playgroud)
在测试中我使用 sinon.stub
sinon.stub(request, "post").returns(Promise.resolve({}))
Run Code Online (Sandbox Code Playgroud)
然而,这个存根并没有真正捕捉到请求中的“post”方法。我查看了源代码并尝试了很多方法(比如存根构造函数),但没有一个有效。
想知道有没有人以前试过这个。我应该如何根据要求存根这个 post 方法?
谢谢!
您的代码没有调用request.post()
,因此对其进行存根将无法捕捉到您正在拨打的电话。
相反,您需要存根request
函数本身,这很难单独使用 Sinon,因为它需要一个“父”对象,它可以在其中替换/存根方法/函数。
您可以使用 解决这个问题proxyquire
,您可以使用它来“捕获”导入request
并将其替换为存根:
const sinon = require('sinon');
const request = require('request');
const proxyquire = require('proxyquire');
let stub = sinon.stub();
const mod = proxyquire('./your-module', { request : stub });
Run Code Online (Sandbox Code Playgroud)
在您的测试用例中,您可以对stub
传递的回调进行让步:
let fakeError = null;
let fakeResponse = {};
let fakeBody = '';
stub.reset();
stub.yields(fakeError, fakeResponse, fakeBody);
Run Code Online (Sandbox Code Playgroud)
该参数yields
代表err
,res
并body
在你的代码。您可以通过各种组合来检查您的代码是否正确处理响应。
调用的原因stub.reset()
是您需要确保在每次测试之前将存根重置为其原始状态(因此它开始“新鲜”)。
归档时间: |
|
查看次数: |
558 次 |
最近记录: |