2015-05-31 27 views
1

我試圖通過REST API來測試一些數據。數據作爲數組存儲在項目中。關閉服務器,但數據仍然存在

我想對數據進行「還原」一個測試套件運行每次都讓我知道數據的陣列中的量。

但是,當IM測試崗位。插入的元素在下一個測試套件中,即使我在每次測試之前啓動和停止服務器。

app.js要求用戶陣列,因此通過停止和啓動服務器,我想每一個測試之前,我是乾淨的,但它並不

Thansk。

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我 知道REST API應該在自己的文件夾。 :)

var path = require('path'); 
     var bodyParser = require('body-parser'); 

     //For testing to delete the cached user array 
     delete require.cache[require.resolve('./users')]; 

     var users = require('./users'); 
     var express = require('express'); 

     function findUser(users, email) { 
      var result = users.filter(function(u) { 
       return u.email === email; 
      }); 
      if(result.length >= 1) { 
       return result[0]; 
      } 
      return undefined; 
     } 

     var app = express(); 

     app.use(bodyParser.json()); 
     app.use(bodyParser.urlencoded({ extended: false })); 


     app.get("/api/users", function(req, res) { 
      res.send(users); 
     }); 

     app.get("/api/users/:email", function(req, res) { 
      var user = findUser(users, req.params.email); 
      if(!user) { 
       return res.status(404).send({error: "user not found"}); 
      } 
      res.send(user); 
     }); 

     app.post("/api/users", function(req, res) { 
      var user = req.body; 
      if(findUser(users, user.email)) { 
       return res.status(400).send({error: "user exist"}); 
      } 
      users.push(user); 
      res.send(user); 
     }); 

     app.put("/api/users/:email", function(req, res) { 
      var user = req.body; 
      if(!findUser(users, req.params.email)) { 
       return res.status(404).send({error: "user not found"}); 
      } 
      if(!user) { 
       return res.status(404).send({error: "no user provided"}); 
      } 
      for(var i = 0; i < users.length; i += 1) { 
       if(users[i].email === user.email) { 
        users[i].password = user.password; 
        break; 
       } 
      } 
      res.send(user); 
     }); 

     app.delete("/api/users/:email", function(req, res) { 
      var user = findUser(users, req.params.email); 
      if(!user) { 
       return res.status(404).send({error: "user not found"}); 
      } 
      for(var i = 0; i < users.length; i++) { 
       if(users[i].email === req.params.email) { 
        users.splice(i, 1); 
        break; 
       } 
      } 
      res.send(user); 
     }); 

     app.all('*', function(req, res) { 
      res.status(500).send(req.url + " not a valid"); 
     }); 

     if(global.activeTest === undefined){ 
      app.listen(3000, function() { 
       console.log("Rest API started, listen on port 3000"); 
      }); 
     } 

     module.exports = app; 
+0

你能告訴'app.js'? – JME

+0

當然,它的增加。我試圖刪除兌現數據,並工作。但是,如果有更好的方式,讓我知道:) – msDefua

+0

感謝您添加'app.js'代碼。刪除緩存的所需用戶真的有用嗎?這對我來說沒有意義,但如果你真的嘗試/測試過它,我不能跟你爭論。我要提出涉及重構,在一個函數初始化'user'變種的代碼,並揭露它,這樣你可以在每次測試之前「重新初始化」它不同的解決方案。我會很快發佈我的建議解決方案。 – JME

回答

0

我的解決方案(正如我在上面的評論中提到的)將重構代碼,該代碼將var初始化爲一個單獨的函數,可以在每次測試之前調用該函數。

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; 

users.js以此爲我的樣本數據:

module.exports = [ 
    { email: 'email0', password: 'password0' }, 
    { email: 'email1', password: 'password1' }, 
    { email: 'email2', password: 'password2' }, 
    { email: 'email3', password: 'password3' }, 
    { email: 'email4', password: 'password4' }, 
    { email: 'email5', password: 'password5' }, 
    { email: 'email6', password: 'password6' }, 
    { email: 'email7', password: 'password7' }, 
    { email: 'email8', password: 'password8' }, 
    { email: 'email9', password: 'password9' } 
]; 

我是能夠成功地通過每個測試之前調用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(); 
     }); 
    }); 

    }); 

}); 

正如你所看到的,我寫了三個測試。

  1. 得到所有用戶(驗證初始數爲10)
  2. 刪除用戶(驗證計數現在是9)
  3. 得到所有用戶(驗證計數爲10再次)

這些,決不是詳盡的測試,但他們確認users每測試之前進行正確的初始化。

+0

正是我在尋找,非常感謝!在你的app.js版本中,你使用module.exports = exports = app;那和module.exports有什麼區別= app; – msDefua

+0

您的歡迎。 'module.exports' /'exports'問題超出了這個問題的範圍。如果你想要技術上的差異,請查看[NodeJS doc](https:// nodejs。組織/ API/modules.html#modules_module_exports)。此外,這個問題已經被問到/在stackoverflow中回答,請參閱[這裏](http://stackoverflow.com/questions/7137397/module-exports-vs-exports-in-node-js)。 – JME

0

看起來app.listen()是異步的,所以你的測試繼續,無論服務器是否停止運行。我會把你的測試放在callback參數裏面。

+0

我會試試看。 – msDefua

相關問題