我应该如何自动启动nodejs应用程序进行测试

时间:2013-11-02 09:56:11

标签: node.js express automated-tests

我有一个nodejs restful样式服务,它没有前端,只接受数据,然后用它做一些事情。

我已经对我想要的大多数方法级别的东西进行了单元测试,但是现在我想基本上做一些自动化测试以证明它们一起工作。当我使用ASP.MVC和IIS时,它很容易,因为服务器始终打开,所以我只是设置场景(将虚拟guff插入DB)然后创建一个HttpRequest并将其发送到服务器并声明我得到了我期望的

然而,在nodejs中存在一些挑战,因为应用程序需要通过命令行或其他一些机制运行,所以假设我有一个将开始监听的app.js,我是否有办法自动启动在我运行我的测试然后在我的测试完成后关闭它?

我目前正在使用Yadda和Mocha进行测试,所以我可以保持它以BDD风格的方式编写,但是我希望Web应用程序的启动与我正在使用的框架无关。

3 个答案:

答案 0 :(得分:9)

只需公开一些方法来启动和停止您的网络服务器。你的app.js文件可能是这样的:

var app = express()
var server = null
var port = 3000

// configure your app here...

exports.start = function(cb) {
  server = http.createServer(app).listen(port, function () {
    console.log('Express server listening on port ' + port)

    cb && cb()
  })
}

exports.close = function(cb) {
  if (server) server.close(cb)
}

// when app.js is launched directly
if (module.id === require.main.id) {
  exports.start()
}

然后在你的测试中你可以做这样的事情(基于mocha的例子):

var app = require('../app')

before(function(done) {
  app.start(done)
})

after(function(done) {
  app.close(done)
})

答案 1 :(得分:1)

了解超级https://github.com/visionmedia/supertest 你可以编写像

这样的测试
describe('GET /users', function(){
 it('respond with json', function(done){
    request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200, done);   
  }) 
 })

答案 2 :(得分:0)

使用gimenete的答案,这是带有异步等待和表达的服务(服务器)的示例:

service.js:

const app = require('express')()
const config = require('./config')

let runningService

async function start() {
  return new Promise((resolve, reject) => {
    runningService = app.listen(config.get('port'), config.get('hostname'), () => {
      console.log(`API Gateway service running at http://${config.get('hostname')}:${config.get('port')}/`)
      resolve()
    })
  })
}

async function close() {
  return new Promise((resolve, reject) => {
    if (runningService) {
      runningService.close(() => {
      })
      resolve()
    }
    reject()
  })
}

module.exports = {
  start,
  close
}

service.spec.js:

const service = require('../service')

beforeEach(async () => {
  await service.start()
})

afterEach(async () => {
  await service.close()
})