Sinon假XML不捕获请求

我正在尝试使用Lab和Sinon来编写一些testing,用于在我的文件中调用的各种HTTP请求。 我遵循http://sinonjs.org/上的假XMLHttpRequest示例,但是当我运行我的testing时,似乎并没有实际捕获任何请求。

这是(相关的)testing代码:

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(); }); }); 

创build是我从其他文件导入的function,在这里:

 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。 但是,运行testing后,请求variables仍然是空的,似乎没有捕获任何请求。 这绝对不是实际提交的请求,因为没有创build票据/问题,我需要修正以实际捕获请求?

你的问题是显而易见的:你正在NodeJS中运行代码,但是Sinon中的networking存根是XMLHttpRequest ,这是一个浏览器特定的API。 它不存在于Node中,因此,安装程序将无法工作。

这意味着如果这应该工作,你将需要在浏览器中运行testing。 Karmatesting运行器可以帮助你,如果你需要自动化。

为了在Node中完成这个工作,你可以采取一种方法,试图在更高的层次上进行zendesk – 意味着对zendeskjira的方法进行存根,或者你可以继续使用zendesknetworking响应(这使得testing成为更脆弱一点)。

要继续保留HTTP呼叫,可以在使用Nock的节点中执行此操作。 像上面那样保存请求是这样完成的:

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

为了得到一些关于如何在更高级别上进行挖掘的见解,我写了一个关于使用dependency injection和Sinon的答案 ,而Morgan Roderick的这篇文章给出了一个链接接口的介绍。