我想集成测试这个javascript代理服务器。
var express = require(["express"], function(){}),
http = require(["http"], function(){}),
port = (process.env.PORT || 8001),
server = module.exports = express(),
httpProxy = require(['http-proxy'], function(){});
var proxy = httpProxy.createProxyServer();
// SERVER CONFIGURATION
// ====================
server.configure(function() {
server.use(function(req, res, next) {
if (req.url.indexOf('/any/thing') === 0) {
//console.log(res);
proxy.web(req, res, {target: 'http://any.thing.com'});
} else {
next();
}
});
server.use('/anything', express["static"](__dirname + "/../public"));
server.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
server.use(express.bodyParser());
server.use(server.router);
});
// Start Node.js Server
http.createServer(server).listen(port);
我的想法是使用SinonJS创建一个假的服务器。 Web前端向原始代理服务器发送请求。该请求将被转发到虚假服务器,该虚假服务器发回虚假响应。我想用Jasmine写测试。
我不知道如何设置这一切。我开始使用HTML文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Jasmine Spec Runner v2.2.0</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-2.2.0/jasmine_favicon.png">
<link rel="stylesheet" href="lib/jasmine-2.2.0/jasmine.css">
<script src="lib/jasmine-2.2.0/jquery-2.1.4.js"></script>
<script src="lib/jasmine-2.2.0/jasmine.js"></script>
<script src="lib/jasmine-2.2.0/jasmine-html.js"></script>
<script src="lib/jasmine-2.2.0/boot.js"></script>
<script src="lib/jasmine-2.2.0/jasmine-jquery.js"></script>
<script src="lib/jasmine-2.2.0/sinon.js"></script>
<!-- libs -->
<script src="lib/jasmine-2.2.0/require.js"></script>
<script src="src/config.js"></script>
<!-- Server -->
<script src="src/server.js"></script>
<!-- add spec files here -->
</head>
<body>
</body>
</html>
我是否可以在此文件中启动代理服务器,如此行<script src="src/server.js"></script>
中所做的那样?
然后我会在spec文件中启动虚假服务器:
describe("Integration Tests", function(){
var server;
beforeAll(function(){
server = sinon.fakeServer.create();
server.autoRespond = true;
server.respondImmediately = true;
serverResponse([200, {}, '{}']);
});
function serverResponse(response){
server.respondWith(/^https?:any.thing.com/, response);
}
it ("should ...", function(){
expect(...)...
});
});
我可以这样做吗?它对我不起作用,因为服务器无法启动。控制台出现以下错误:
未捕获的ReferenceError:未定义过程
无法加载资源:服务器响应状态为404(未找到)
未捕获错误:脚本错误:快递
http://requirejs.org/docs/errors.html#scripterror
无法加载资源:&gt;服务器响应状态为404(未找到)
未捕获错误:脚本错误:http
有什么问题?
答案 0 :(得分:1)
我不确定你的方案中存在什么问题,但我会建议过去对我有用的东西。
我使用nock,该项目有详细记录,以下是我将如何配置它的情况:
var nock = require('nock');
var server = nock('http://your.domain.here')
.get('/any/thing')
.reply(200, {
// I don't know, probably you want some content
// so you can assert on that?
});
nock
所做的是拦截对http://your.domain.here/any/thing
的所有调用,并使用您定义的有效负载返回200
。