【问题标题】:Sinon Fake XML Not Capturing RequestsSinon Fake XML 未捕获请求
【发布时间】:2017-11-15 14:53:46
【问题描述】:

我正在尝试使用Lab 和Sinon 为我的文件中调用的各种HTTP 请求编写一些测试。我在http://sinonjs.org/ 遵循了 Fake 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 变量仍然为空,似乎没有捕获任何请求。由于没有创建票证/问题,因此肯定没有实际提交请求,我需要修复什么才能实际捕获请求?

【问题讨论】:

    标签: node.js sinon hapijs lab


    【解决方案1】:

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

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

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

    要继续存根 HTTP 调用,您可以在 Node 中使用 Nock 执行此操作。像上面那样保存请求是这样完成的:

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

    为了深入了解如何在更高级别进行 stub,我写了 this answer 关于使用依赖注入和 Sinon,而 this article by Morgan Roderick 介绍了链接接缝。

    【讨论】:

    • 哇,感谢您的帮助!我将研究 Nock 以对 HTTP 调用进行存根,这似乎正是我所需要的。顺便说一句,您的“此答案”链接无效,因此我对其进行了编辑
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多