Sinon Fake XML 未捕获请求
Sinon Fake XML Not Capturing Requests
我正在尝试使用 Lab and Sinon for various HTTP requests that are called in a file of mine. I followed the Fake XMLHttpRequest example at http://sinonjs.org/ 编写一些测试,但是当我 运行 我的测试似乎实际上没有捕获任何请求。
这是(相关的)测试代码:
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 请求 post 向 API 发送一些负载。然而,在 运行ning 测试之后,requests 变量仍然是空的,似乎没有捕获到任何请求。由于没有创建 tickets/issues,因此绝对不是实际提交请求,我需要修复什么才能实际捕获请求?
从标签中可以明显看出您的问题:您在 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} );
});
为了获得一些关于如何在更高层次上存根的见解,我写了 on using dependency injection and Sinon, while this article by Morgan Roderick 介绍了 link 接缝。
我正在尝试使用 Lab and Sinon for various HTTP requests that are called in a file of mine. I followed the Fake XMLHttpRequest example at http://sinonjs.org/ 编写一些测试,但是当我 运行 我的测试似乎实际上没有捕获任何请求。
这是(相关的)测试代码:
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 请求 post 向 API 发送一些负载。然而,在 运行ning 测试之后,requests 变量仍然是空的,似乎没有捕获到任何请求。由于没有创建 tickets/issues,因此绝对不是实际提交请求,我需要修复什么才能实际捕获请求?
从标签中可以明显看出您的问题:您在 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} );
});
为了获得一些关于如何在更高层次上存根的见解,我写了