Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的存根请求库_Javascript_Unit Testing_Request_Mocha.js_Sinon - Fatal编程技术网

javascript中的存根请求库

javascript中的存根请求库,javascript,unit-testing,request,mocha.js,sinon,Javascript,Unit Testing,Request,Mocha.js,Sinon,我正在使用第三方restful服务发送短信验证码。我为它写了一个单元测试。但是,我不希望每次运行单元测试时都收到消息 代码如下: const _request = require("request"); _request({ method: "POST", url: "http://blah.com/json", form: { apikey: "blah", mobile: input.mobilePhoneNumber, text: `code

我正在使用第三方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”方法。我查看了源代码并尝试了许多方法(比如使用构造函数),但没有一种有效

想知道以前有没有人试过这个。我应该如何根据要求将此post方法存根


谢谢

您的代码没有调用
request.post()
,因此存根它不会捕获您正在进行的调用

相反,您需要存根
请求
函数本身,这很难单独使用Sinon,因为它需要一个“父”对象,可以在其中替换/存根方法/函数

您可以使用它来解决这个问题,您可以使用它来“捕获”导入
请求
,并将其替换为存根:

const sinon      = require('sinon');
const request    = require('request');
const proxyquire = require('proxyquire');

let stub  = sinon.stub();
const mod = proxyquire('./your-module', { request : stub });
在测试用例中,您可以使
存根
屈服于您传递的回调:

let fakeError    = null;
let fakeResponse = {};
let fakeBody     = '';

stub.reset();
stub.yields(fakeError, fakeResponse, fakeBody);
的参数产生
表示代码中的
err
res
body
。您可以传递各种组合来检查代码是否正确处理响应


调用
stub.reset()
的原因是,在每次测试之前,您需要确保stub被重置为其原始状态(因此它会“重新启动”)。

单元测试中的
request
是什么?这是一个lib:@robertklepreson我问的是因为您的代码没有调用
request.post()
(它正在调用
请求
),而
请求
库本身不支持承诺(因此从存根返回承诺没有意义)。