7

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

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

然而,nodejs 存在一些挑战,因为应用程序需要通过命令行或其他机制运行,所以鉴于我有一个 app.js 将开始监听,有什么方法可以让我在我之前自动启动它运行我的测试,然后在我的测试完成后关闭它?

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

4

3 回答 3

10

只需公开一些方法来启动和停止您的网络服务器。您的 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)
})
于 2013-11-02T13:49:21.257 回答
1

看看 supertest 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);   
  }) 
 })
于 2013-11-02T12:55:11.143 回答
1

使用 gimenete 的答案,这是一个具有异步等待和快递的服务(服务器)的示例:

服务.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()
})
于 2018-12-01T23:44:24.970 回答