Javascript mocha测试后关闭服务器,但数据仍然存在
我正试图通过RESTAPI测试一些数据。数据作为数组存储在项目中 我希望每次运行测试套件时都能“恢复”数据,以便了解阵列中的数据量 但是当我测试帖子的时候。插入的元素在下一个测试套件中,即使我在每次测试之前启动和停止服务器Javascript mocha测试后关闭服务器,但数据仍然存在,javascript,node.js,express,mocha.js,Javascript,Node.js,Express,Mocha.js,我正试图通过RESTAPI测试一些数据。数据作为数组存储在项目中 我希望每次运行测试套件时都能“恢复”数据,以便了解阵列中的数据量 但是当我测试帖子的时候。插入的元素在下一个测试套件中,即使我在每次测试之前启动和停止服务器 var path = require('path'); var bodyParser = require('body-parser'); var express = require('express'); var clone = require('clone'); // &l
var path = require('path');
var bodyParser = require('body-parser');
var express = require('express');
var clone = require('clone'); // <-- add `clone` as a dependency
var users;
function initUsers() {
users = clone(require('./users'));
}
// ... the rest if your code, initializing express/adding route handlers
app.listen(3000, function() {
console.log("Rest API started, listen on port 3000");
});
module.exports = exports = app;
exports.initUsers = initUsers;
app.js需要用户数组,因此通过停止和启动服务器,我认为在每次测试之前我都会保持干净,但事实并非如此
坦斯克
global.test = true;
// Test server setup
var app = require('../app');
var testPort = 9999;
var testServer;
// Dependencies
var should = require('should');
var request = require('request');
var baseUrl = 'http://localhost:9999/api';
describe('RESTApi : GET Methods', function () {
//Start the Server before the TESTS
beforeEach(function (done) {
testServer = app.listen(testPort, function () {
console.log("Server is listening on: " + testPort);
done();
})
.on('error', function (err) {
console.log(err);
});
});
afterEach(function () { //Stop server after the test
testServer.close(function () {
console.log("closing server");
});
});
TEST here
});
describe('RESTApi : POST Methods', function () {
//Start the Server before the TESTS
before(function (done) {
testServer = app.listen(testPort, function () {
console.log("Server is listening on: " + testPort);
done();
})
.on('error', function (err) {
console.log(err);
});
});
after(function () { //Stop server after the test
testServer.close(function () {
console.log("closing server");
});
});
TEST here
});
------App.js-----
我知道RESTAPI应该在它自己的文件夹中。:)
var path=require('path');
var bodyParser=require('body-parser');
//用于测试删除缓存的用户阵列
删除require.cache[require.resolve('./users');
var users=需要('./用户');
var express=需要(“express”);
功能findUser(用户、电子邮件){
var result=users.filter(函数(u){
返回u.email==电子邮件;
});
如果(result.length>=1){
返回结果[0];
}
返回未定义;
}
var-app=express();
use(bodyParser.json());
use(bodyParser.urlencoded({extended:false}));
app.get(“/api/users”),函数(req,res){
res.send(用户);
});
app.get(“/api/users/:email”),函数(req,res){
var user=findUser(用户、请求参数、电子邮件);
如果(!用户){
返回res.status(404.send({错误:“未找到用户”});
}
res.send(用户);
});
app.post(“/api/users”),函数(req,res){
var user=req.body;
if(findUser(用户,user.email)){
返回res.status(400).send({错误:“用户存在”});
}
push(用户);
res.send(用户);
});
app.put(“/api/users/:email”),函数(req,res){
var user=req.body;
如果(!findUser(用户,请求参数电子邮件)){
返回res.status(404.send({错误:“未找到用户”});
}
如果(!用户){
返回res.status(404.send)({error:“未提供用户”});
}
对于(变量i=0;i
看起来app.listen()
是异步的,所以不管服务器是否停止,测试都会继续运行。我会将您的测试放在回调
参数中。我的解决方案(正如我在上面的评论中提到的)是将初始化用户
变量的代码重构到一个单独的函数中,该函数可以在每次测试之前调用
var path = require('path');
var bodyParser = require('body-parser');
var express = require('express');
var clone = require('clone'); // <-- add `clone` as a dependency
var users;
function initUsers() {
users = clone(require('./users'));
}
// ... the rest if your code, initializing express/adding route handlers
app.listen(3000, function() {
console.log("Rest API started, listen on port 3000");
});
module.exports = exports = app;
exports.initUsers = initUsers;
通过在每次测试之前调用initUsers()
,我能够成功地进行测试,如下所示:
var app = require('../app');
var initUsers = require('../app').initUsers;
var should = require('should');
var request = require('request');
var baseUrl = 'http://localhost:3000/api';
describe('RESTApi', function() {
describe('GET Methods', function () {
beforeEach(function() {
initUsers();
});
it('should get all users initially', function(done) {
request(baseUrl + '/users', function(err, res) {
var data = JSON.parse(res.body);
data.length.should.equal(10);
done();
});
});
it('should remove user', function(done) {
request.del(baseUrl + '/users/email1', function(err, res) {
var data = JSON.parse(res.body);
data.email.should.equal('email1');
data.password.should.equal('password1');
request(baseUrl + '/users', function(err, res) {
var data = JSON.parse(res.body);
data.length.should.equal(9);
done();
});
});
});
it('should get all users again', function(done) {
request(baseUrl + '/users', function(err, res) {
var data = JSON.parse(res.body);
data.length.should.equal(10);
done();
});
});
});
});
如你所见,我写了三个测试
这些绝非详尽无遗的测试,但它们验证了
用户
在每次测试之前都已正确初始化。您能显示app.js
?当然,它添加了。我试着删除现金数据,结果成功了。但是如果有更好的方法让我知道:)谢谢你添加app.js
代码。删除缓存的必需用户真的有效吗?这对我来说毫无意义,但如果你真的尝试/测试了它,我无法与你争辩。我打算提出一个不同的解决方案,将初始化user
var的代码重构为一个函数,并将其公开,以便您可以在每次测试之前“重新初始化”它。我将很快发布我的建议解决方案。这正是我想要的,非常感谢!。在app.js版本中,您使用module.exports=exports=app;这与module.exports=app有什么区别;欢迎光临。模块.exports
/exports
问题超出了此问题的范围。如果您想了解技术差异,请查看。此外,该问题已在stackoverflow中提出/回答,请参阅。
var app = require('../app');
var initUsers = require('../app').initUsers;
var should = require('should');
var request = require('request');
var baseUrl = 'http://localhost:3000/api';
describe('RESTApi', function() {
describe('GET Methods', function () {
beforeEach(function() {
initUsers();
});
it('should get all users initially', function(done) {
request(baseUrl + '/users', function(err, res) {
var data = JSON.parse(res.body);
data.length.should.equal(10);
done();
});
});
it('should remove user', function(done) {
request.del(baseUrl + '/users/email1', function(err, res) {
var data = JSON.parse(res.body);
data.email.should.equal('email1');
data.password.should.equal('password1');
request(baseUrl + '/users', function(err, res) {
var data = JSON.parse(res.body);
data.length.should.equal(9);
done();
});
});
});
it('should get all users again', function(done) {
request(baseUrl + '/users', function(err, res) {
var data = JSON.parse(res.body);
data.length.should.equal(10);
done();
});
});
});
});