【问题标题】:Unit Testing Express app in JenkinsJenkins 中的单元测试 Express 应用程序
【发布时间】:2014-09-22 02:30:31
【问题描述】:

好的,我正在搜索几个小时的解决方案,以便在 Jenkins 中为我的 Express JS 应用运行我的 Mocha 单元测试。

编写测试很容易,但是将测试与我的应用程序连接起来有点困难。我当前测试的一个例子:

/tests/backend/route.test.js

var should    = require('should'),
    assert    = require('assert'),
    request   = require('supertest'),
    express   = require('express');

describe('Routing', function() {

  var app = 'http://someurl.com';

  describe('Account', function() {
    it('should return error trying to save duplicate username', function(done) {
      var profile = {
        username: 'vgheri',
        password: 'test',
        firstName: 'Valerio',
        lastName: 'Gheri'
      };
    // once we have specified the info we want to send to the server via POST verb,
    // we need to actually perform the action on the resource, in this case we want to 
    // POST on /api/profiles and we want to send some info
    // We do this using the request object, requiring supertest!
    request(app)
    .post('/api/profiles')
    .send(profile)
    // end handles the response
    .end(function(err, res) {
          if (err) {
            throw err;
          }
          // this is should.js syntax, very clear
          res.should.have.status(400);
          done();
        });
    });
});

在上面的示例中,我连接到一个正在运行的应用程序(参见 ```var app = 'http://someurl.com'``)。显然,这在 Jenkins 内部不起作用,除非我可以告诉 Jenkins 首先运行应用程序,然后检查 localhost url。但是如何做到这一点呢?

现在,如果我看一下 https://www.npmjs.org/package/supertest,这应该足以测试我的 express 应用了:

var request = require('supertest')
  , express = require('express');

var app = express();

但事实并非如此。我在所有要测试的 url 上收到 404 错误。

有谁知道如何在 Jenkins 中测试我的应用程序?

【问题讨论】:

    标签: javascript node.js express jenkins


    【解决方案1】:

    您在http://someurl.com 引用的应用程序是您尝试为其编写此测试的应用程序吗?如果是这样……

    Supertest 应该允许您在不需要运行外部服务器的情况下运行测试。完成此操作的方法是将服务器路由 Express 代码与您将运行的实际启动服务器的代码分开,并在服务器路由代码上使用 Supertest。

    这是一个例子:

    鉴于此目录结构:

    ./package.json
    ./server/index.js
    ./app.js
    ./test/server-test.js
    

    这是我的文件:

    ./package.json

    此示例不需要所有这些依赖项,我只是从我在项目中使用的 package.json 中提取了它。

    {
      "name": "StackOverflowExample",
      "version": "1.0.0",
      "description": "Example for stackoverflow",
      "main": "app.js",
      "scripts": {
        "test": "mocha"
      },
      "author": "Mark",
      "license": "ISC",
      "dependencies": {
        "body-parser": "^1.15.2",
        "ejs": "^2.5.2",
        "express": "^4.14.0",
        "express-validator": "^2.21.0",
      },
      "devDependencies": {
        "chai": "^3.5.0",
        "mocha": "^3.1.2",
        "supertest": "^2.0.1"
      }
    }
    

    ./server/index.js

    var express = require('express');
    var app = express();
    app.get('/', function(req, res) {
        res.send('Hello World');
    });
    module.exports = app;
    

    ./app.js

    var app = require('./server');
    var server = app.listen(8000, function() {
        console.log('Listening on port 8000');
    });
    

    ./tests/server-test.js

    var request = require('supertest');
    var app = require('../server');
    
    var assert = require('assert'); //mocha
    var chai = require('chai');
    var expect = null;
    
    chai.should();
    expect = chai.expect;
    
    describe('GET /', function() {
        it('should return a 200', function(done) {
            request(app).get('/').expect(200, done);
        });
    });
    

    我在这里使用MochaChai(没有时间重构并简化示例,抱歉)。重点是在 it 语句中您可以运行测试。

    这样做不需要运行单独的服务器。 Supertest 会神奇地为您启动一个并根据您从服务器模块导出的快速服务器运行它。我认为这种方法应该允许您通过 Jenkins 无缝地运行测试。

    ./server/index.js 中,创建了一个 Express 对象。该对象通过require./app.js./test/server-test.js 中导出和导入。在./app.js 中,它用于通过listen() 启动服务器。在测试文件中,Supetest 使用它来启动一个服务器进行内部测试。

    当您在本例中运行服务器时,您将通过./app.js 运行它。这将设置您选择的端口(本例中为 8000)并开始侦听该端口上的连接。

    希望这会有所帮助!祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-16
      • 2017-08-05
      • 2015-08-13
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      相关资源
      最近更新 更多