【问题标题】:How to mock a server?如何模拟服务器?
【发布时间】:2015-09-19 16:17:45
【问题描述】:

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

我可以像在&lt;script src="src/server.js"&gt;&lt;/script&gt; 这一行中那样从这个文件中启动代理服务器吗?

然后我会在规范文件中启动假服务器:

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(...)...
    });
});

我可以这样做吗?它对我不起作用,因为服务器无法启动。控制台给出这些错误:

未捕获的引用错误:未定义进程

加载资源失败:服务器响应状态为 404(未找到)

未捕获的错误:脚本错误:express

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

加载资源失败:> 服务器响应状态为 404(未找到)

未捕获的错误:脚本错误:http

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

怎么了?

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 感谢您的回答,但是有没有办法用 sinonjs 做到这一点?以及如何以及在哪里启动服务器?我可以在html文件中做吗?
    猜你喜欢
    • 2018-02-19
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2017-09-23
    • 2021-07-18
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多