我正在尝试使用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变量仍然为空,并且似乎未捕获任何请求。绝对没有提交请求,因为尚未创建票证/问题,我需要解决什么才能真正捕获请求?
最佳答案
从标记中可以明显看出您的问题:您正在NodeJS中运行代码,但是Sinon中的网络存根用于XMLHttpRequest
,这是浏览器特定的API。它在Node中不存在,因此设置将永远无法进行。
这意味着,如果该方法可行,则需要在浏览器中运行测试。如果需要自动操作,Karma test runner可以帮助您。
要使它在Node中起作用,您可以采用一种尝试在更高层次上进行存根的方法-意味着对zendesk
和jira
的方法进行存根,或者可以继续对网络响应进行存根的方法(即使测试更加脆弱)。
要继续存出HTTP调用,可以在Node中使用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给出了链接接缝的简介。