Sinon假XML不捕获请求

时间:2017-06-13 17:35:13

标签: node.js sinon hapijs lab

我尝试使用Lab和Sinon为我的文件中调用的各种HTTP请求编写一些测试。我在http://sinonjs.org/跟踪了假的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变量仍然是空的,似乎没有捕获任何请求。它绝对没有提交请求,因为没有创建故障单/问题,我需要修复什么来实际捕获请求?

1 个答案:

答案 0 :(得分:1)

您的问题在标记中很明显:您正在运行NodeJS中的代码,但Sinon中的网络存根是XMLHttpRequest,这是一个特定于浏览器的API。它在Node中不存在,因此,设置将永远不会起作用。

这意味着如果这应该有效,您需要在浏览器中运行测试。如果您需要自动化,Karma test runner可以帮助您。

要在Node中完成这项工作,您可以采用一种方法,尝试在更高级别存根 - 这意味着将zendeskjira的方法存根,或者您可以继续使用存根网络响应的方法(这使得测试更加脆弱)。

要继续删除HTTP调用,可以使用Nock在节点中执行此操作。保存上面的请求就像这样:

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

为了获得关于如何在更高级别存根的一些见解,我写了this answer使用依赖注入和Sinon,而this article by Morgan Roderick给出了链接接缝的介绍。