Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jenkins中的单元测试Express应用程序_Javascript_Node.js_Express_Jenkins - Fatal编程技术网

Javascript Jenkins中的单元测试Express应用程序

Javascript Jenkins中的单元测试Express应用程序,javascript,node.js,express,jenkins,Javascript,Node.js,Express,Jenkins,好的,我正在搜索几个小时的解决方案,以便在Jenkins内部运行我的Mocha单元测试,用于我的Express JS应用程序 编写测试非常简单,但将测试与我的应用程序连接起来有点困难。我当前测试的一个示例: /tests/backend/route.test.js var should = require('should'), assert = require('assert'), request = require('supertest'), expre

好的,我正在搜索几个小时的解决方案,以便在Jenkins内部运行我的Mocha单元测试,用于我的Express JS应用程序

编写测试非常简单,但将测试与我的应用程序连接起来有点困难。我当前测试的一个示例:

/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=``。显然,这在Jenkins内部不起作用,除非我可以告诉Jenkins先运行应用程序,然后检查本地主机url。但如何做到这一点呢

现在,如果我看一看,这应该足以测试我的express应用程序:

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

var app = express();
但事实并非如此。我收到404错误的所有网址,我想测试


任何知道如何在Jenkins内部测试我的应用程序的人?

就是您在中引用的应用程序http://someurl.com 您试图为其编写此测试的应用程序?如果是的话

Supertest应该允许您在不需要运行外部服务器的情况下运行测试。实现这一点的方法是将服务器路由Express代码从实际启动服务器的代码中分离出来,并对服务器路由代码使用Supertest

以下是一个例子:

给定此目录结构:

./package.json
./server/index.js
./app.js
./test/server-test.js
这是我的档案:

/package.json

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

./server/index.js

//app.js

./tests/server-test.js

我正在使用,但这里没有时间重构和简化示例,对不起。主要的一点是,在it语句中,您可以运行测试

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

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

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

希望这有帮助!祝你好运

{
  "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"
  }
}
var express = require('express');
var app = express();
app.get('/', function(req, res) {
    res.send('Hello World');
});
module.exports = app;
var app = require('./server');
var server = app.listen(8000, function() {
    console.log('Listening on port 8000');
});
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);
    });
});