我已经编写了一个小node
模块,提出http
请求,但我无法对其进行测试。
有问题的代码如下所示:
module.exports = (function () {
var http = require("http"),
Promise = require("promise");
var send = function send(requestOptions, requestBody) {
return new Promise(function (resolve, reject) {
http.request(requestOptions, function (response) {
var responseChunks = [];
response.on('data', function (chunk) {
responseChunks.push(chunk);
});
response.on('end', function () {
resolve(Buffer.concat(responseChunks));
});
response.on('error', function (e) {
reject(e);
});
}).end(requestBody);
});
};
return {
send: send
}
我试图测试我的send
方法,特别是http.request
调用的回调函数。
我想我需要做的是从response
模拟或存根http.request
对象,以便我可以测试回调函数的执行。但我无法弄清楚如何做到这一点。
如果我有任何相关性,我使用node
v4.1,jasmine
v2.3和sinon
v1.17
答案 0 :(得分:2)
试试nock。它非常适合在测试用例中模拟http请求。
答案 1 :(得分:0)
mocha测试框架工作和Should.JS(断言lib)非常好。
请参阅入门部分:https://mochajs.org/
基本上,您使用mocha
框架来创建测试用例。然后使用should.js
节点模块进行断言(关于应该发生什么的事实)。
您可以通过npm install mocha
& npm install should
module.exports.run = function() {
var chalk = require('chalk');
var should = require('should');
var http = require("http");
describe('test lib description', function(done){
it('Individual Test Case description', function(done) {
function send(requestOptions, requestBody) {
return new Promise(function (resolve, reject) {
http.request(requestOptions, function (response) {
var responseChunks = [];
// Assertions using Should.JS
// Example: The http status code from the server should be 200
should.equal(response.statusCode , 200);
response.should.have.property('someProperty');
response.should.have.property('someProperty','someVal');
response.on('data', function (chunk) {
responseChunks.push(chunk);
done(); // Needed To tell mocha we are ready to move on to next test
});
response.on('end', function () {
resolve(Buffer.concat(responseChunks));
done();
});
response.on('error', function (e) {
reject(e);
done();
});
}).end(requestBody);
});
};
});
});
}
node ./node_modules/mocha/bin/mocha
testFile
答案 2 :(得分:0)
您可以尝试创建响应请求的本地或“模拟”服务器,而不是存根。这避免了必须存根http.request。本地服务器的一个好处是,无论您使用http.request,XMLHttpRequest还是类似的方法来获取在线资源,此方法都应该有效。
您可以尝试mock server。有了它,您可以创建一个虚假的服务器来满足您的请求。
npm install mockserver-grunt --save-dev
npm install mockserver-client --save-dev
在您的规范(或测试)中,您可以使用以下内容(根据您的需要进行更改):
var mockServer = require("mockserver-grunt");
var mockServerClient = require("mockserver-client").mockServerClient;
beforeAll(function(done) {
// start the server
mockServer.start_mockserver({
serverPort: 1080,
verbose: true
});
// setup how to respond
let response = {name:'value'};
let statusCode = 203;
mockServerClient("localhost", 1080).mockSimpleResponse('/samplePath', response, statusCode);
setTimeout(function() {
// give time for the mock server to setup
done();
}, 4000);
});
it("should be able to GET an online resource", function(done) {
// perform tests, send requests to http://localhost:1080/samplePath
}
这将在端口1080上启动服务器。对http://localhost:1080/samplePath发出的任何请求都将收到提供的响应。
以类似的方式,可以在测试结束时关闭服务器:
afterAll(function() {
mockServer.stop_mockserver({
serverPort: 1080,
verbose: true
});
});
首次启动服务器时,它将尝试下载服务器所需的jar文件。这是一次性下载(据我所知)。如果没有提供足够的时间,它将无法完全下载,您将最终得到一个无效或损坏的jar文件。要更正此问题,您可以自己下载jar文件。该链接在运行中提供。对我而言,这位于https://oss.sonatype.org/content/repositories/releases/org/mock-server/mockserver-netty/3.10.6/mockserver-netty-3.10.6-jar-with-dependencies.jar。最有可能的是,您需要导航到最新版本。
自从我最初发布以来,我发现了Express JS。 Express启动服务器实例的速度比Mock Server快得多。您也不必担心jar文件。
npm install express --save-dev
var express = require('express');
var app = express();
var port = 3000;
var server;
beforeAll(function() {
server = app.listen(port, function() {
console.log("Listening on port " + port);
});
app.get('/samplePath', function (req, res) {
res.send("my response");
});
});
afterAll(function() {
// shutdown
server.close();
});
it("should be able to GET an online resource", function(done) {
// perform tests, send requests to http://localhost:3000/samplePath
}
如果您想获得幻想,可以返回您使用的路径。例如,如果你转到http://localhost:3000/helloworld,返回值将是helloworld。您可以根据自己的需要进行调整。
app.get('/*', function (req, res) {
res.send(req.params[0]);
});
如果您需要在错误路径中强制执行代码,可以使用
res.status(404) // HTTP status 404: NotFound
.send('Not found');
来源:How to programmatically send a 404 response with Express/Node?
Express JS可以配置为使用HTTPS。使用openssl,可以使用以下命令创建自签名证书:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
来源:How to create a self-signed certificate with openssl?
使用以下内容更新express js代码以使用HTTPS。
const secureOptions = {
key: fs.readFileSync("./spec/ExpressServer/key.pem"),
cert: fs.readFileSync("./spec/ExpressServer/cert.pem")
};
var secureServer = https.createServer(secureOptions, app);
注意:您可能必须配置应用程序的安全性以允许HTTPS的自签名证书。
答案 3 :(得分:0)
我知道这是很久以前问过的,但是以防万一有人正在寻求针对此问题的快速解决方案,而不需要涉及设置额外的模拟服务器,
>您可以使用Jasmine的spyOn
和returnValue
模拟Node的HTTP包的响应。 Node.js文档here读取:
间谍可以对任何函数加桩,并跟踪对该函数和所有参数的调用。
here随后显示为:
通过将间谍与
and.returnValue
链接起来,对该函数的所有调用将返回一个特定值。
所以您要做的就是这个:
spyOn(http, "request").and.returnValue(
//Your mock response goes here.
);
我希望这对其他人有帮助。