Javascript mocha测试后关闭服务器,但数据仍然存在

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

我正试图通过RESTAPI测试一些数据。数据作为数组存储在项目中

我希望每次运行测试套件时都能“恢复”数据,以便了解阵列中的数据量

但是当我测试帖子的时候。插入的元素在下一个测试套件中,即使我在每次测试之前启动和停止服务器

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

  });

});
如你所见,我写了三个测试

  • 获取所有用户(验证初始计数为10)
  • 删除用户(验证计数现在为9)
  • 获取所有用户(验证计数现在再次为10)

  • 这些绝非详尽无遗的测试,但它们验证了
    用户
    在每次测试之前都已正确初始化。

    您能显示
    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();
          });
        });
    
      });
    
    });