如何模拟服务器?

时间:2015-07-02 08:32:25

标签: javascript html node.js server integration-testing

我想集成测试这个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

     

http://requirejs.org/docs/errors.html#scripterror

有什么问题?

1 个答案:

答案 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