Javascript Jenkins中的单元测试Express应用程序
好的,我正在搜索几个小时的解决方案,以便在Jenkins内部运行我的Mocha单元测试,用于我的Express JS应用程序 编写测试非常简单,但将测试与我的应用程序连接起来有点困难。我当前测试的一个示例: /tests/backend/route.test.jsJavascript 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
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);
});
});