Node.js Sinon伪XML不捕获请求

Node.js Sinon伪XML不捕获请求,node.js,sinon,hapijs,lab,Node.js,Sinon,Hapijs,Lab,我正在尝试使用和Sinon编写一些测试,用于在我的文件中调用的各种HTTP请求。我在上使用了伪XMLHttpRequest示例,但当我运行测试时,它似乎并没有捕获任何请求 以下是(相关)测试代码: context('when provided a valid payload', function () { let xhr; let requests; before(function (done) { xhr = sinon.useFakeXMLHttpReq

我正在尝试使用和Sinon编写一些测试,用于在我的文件中调用的各种HTTP请求。我在上使用了伪XMLHttpRequest示例,但当我运行测试时,它似乎并没有捕获任何请求

以下是(相关)测试代码:

context('when provided a valid payload', function () {
    let xhr;
    let requests;

    before(function (done) {
      xhr = sinon.useFakeXMLHttpRequest();
      requests = [];
      xhr.onCreate = function (req) { requests.push(req); };
      done();
    });

    after(function (done) {
      // clean up globals
      xhr.restore();
      done();
    });

    it('responds with the ticket id', (done) => {
      create(internals.validOptions, sinon.spy());
      console.log(requests); // Logs empty array []
      done();
    });
});
create是我从另一个文件导入的函数,如下所示:

internals.create = async function (request, reply) {
  const engineeringTicket = request.payload.type === 'engineering';
  const urgentTicket = request.payload.urgency === 'urgent';

  if (validation.isValid(request.payload)) {
    const attachmentPaths = formatUploads(request.payload.attachments);
    const ticketData = await getTicket(request.payload, attachmentPaths);

    if (engineeringTicket) {
      const issueData = getIssue(request.payload);
      const response = await jira.createIssue(issueData);
      jira.addAttachment(response.id, attachmentPaths);
      if (urgentTicket) {
        const message = slack.getMessage(response);
        slack.postToSlack(message);
      }
    }

    zendesk.submitTicket(ticketData, function (error, statusCode, result) {
      if (!error) {
        reply(result).code(statusCode);
      } else {
        console.log(error);
      }
    });
  } else {
    reply({ errors: validation.errors }).code(400); // wrap in Boom
  }
};

如您所见,它调用jira.createIssue和zendesk.submitTicket,这两个函数都使用HTTP请求向API发布一些有效负载。但是,在运行测试之后,requests变量仍然为空,并且似乎没有捕获任何请求。它肯定不是真正提交请求,因为没有创建票证/问题,我需要修复什么才能真正捕获请求?

从标记中可以明显看出您的问题:您正在NodeJS中运行代码,但Sinon中的网络存根用于
XMLHttpRequest
,这是一个特定于浏览器的API。它不存在于节点中,因此,设置将永远无法工作

这意味着,如果这样做有效,您将需要在浏览器中运行测试。如果需要实现自动化,则可以帮助您实现这一点

为了在Node中实现这一点,您可以尝试在更高的级别上进行stub,这意味着要对
zendesk
jira
的方法进行stub,也可以继续使用stub网络响应的方法(这会使测试更加脆弱)

要继续清除HTTP调用,可以在节点中使用。像上面那样保存请求是这样做的:

var requests = [];
var scope = nock('http://www.google.com')
 .get('/cat-poems')
 .reply(function(uri, requestBody) {
    requests.push( {uri, requestBody} );
 });

为了了解如何在更高的层次上退出,我写了关于使用依赖注入和Sinon的文章,同时介绍了链接接缝。

哇,谢谢你的帮助!我将研究Nock对HTTP调用的存根,这似乎正是我所需要的。顺便说一句,你的“这个答案”链接不起作用,所以我编辑了它