从誓言启动服务器进行测试的正确方法是什么?

cjr*_*uck 10 testing node.js coffeescript express vows

我有一个快速服务器,我正在使用誓言进行测试.我想从誓言测试套件中运行服务器,这样我就不需要让它在后台运行以使测试套件工作,然后我就可以创建一个运行服务器并测试它的蛋糕任务隔离.

server.coffee我创建了(快递)服务器,配置它,设置路线和所谓app.listen(端口)是这样的:

# Express - setup
express = require 'express'
app = module.exports = express.createServer()

# Express - configure and set up routes
app.configure ->
   app.set 'views', etc....
   ....

# Express - start
app.listen 3030
Run Code Online (Sandbox Code Playgroud)

在我的简单中routes-test.js我有:

vows    = require('vows'),
assert  = require('assert'),
server  = require('../app/server/server');

// Create a Test Suite
vows.describe('routes').addBatch({
    'GET /'     : respondsWith(200),
    'GET /401'  : respondsWith(401),
    'GET /403'  : respondsWith(403),
    'GET /404'  : respondsWith(404),
    'GET /500'  : respondsWith(500),
    'GET /501'  : respondsWith(501)
}).export(module);
Run Code Online (Sandbox Code Playgroud)

其中,respondsWith(code)在功能上的一个在誓言文档相似...

当我require在上面的测试中服务器时,它自动开始运行服务器并且测试运行并通过,这很好,但我不觉得我正在以"正确"的方式做到这一点.

我对服务器何时开始没有太多控制权,如果我想将服务器配置为指向"测试"环境而不是默认环境,或者在测试时更改默认日志记录级别会发生什么?

PS我打算将我的誓言转换为Coffeescript,但现在它的所有js都是来自docs的学习模式!

bra*_*zzi 2

这是一个有趣的问题,因为昨晚我做了你想做的事。我有一个小小的 CoffeScript Node.js 应用程序,它的编写方式恰好与您展示的一样。然后,我重构了它,创建了以下内容app.coffee

# ... Imports
app = express.createServer()

# Create a helper function
exports.start = (options={port:3000, logfile:undefined})->
  # A function defined in another module which configures the app
  conf.configure app, options 
  app.get '/', index.get
  # ... Other routes
  console.log 'Starting...'
  app.listen options.port
Run Code Online (Sandbox Code Playgroud)

现在我有一个index.coffee(相当于你的server.coffee)简单如下:

require('./app').start port:3000
Run Code Online (Sandbox Code Playgroud)

然后,我使用Jasmine-nodeZombie.js编写了一些测试。测试框架不同,但原理是一样的:

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

# To avoid annoying logging during tests
logfile = require('fs').createWriteStream 'extravagant-zombie.log'

# Use the helper function to start the app
app.start port: 3000, logfile: logfile

describe "GET '/'", ->
  it "should have no blog if no one was registered", ->
    zombie.visit 'http://localhost:3000', (err, browser, status) ->
      expect(browser.text 'title').toEqual 'My Title'
      asyncSpecDone()
    asyncSpecWait()
Run Code Online (Sandbox Code Playgroud)

要点是:我所做的和我建议的是在启动服务器的模块中创建一个函数。然后,在任何你想要的地方调用这个函数。我不知道这是否是“好的设计”,但它有效并且对我来说似乎具有可读性和实用性。

另外,我怀疑 Node.js 和 CoffeScript 中还没有“好的设计”。这些都是全新的、非常创新的技术。当然,我们可以“感觉有些不对劲”——就像这种情况,两个不同的人不喜欢这个设计并改变了它。我们可以感受到“错误的方式”,但这并不意味着已经有“正确的方式”。总而言之,我相信我们必须在您的开发中发明一些“正确的方法”:)

(但询问做事的好方法也很好。也许有人有好主意,公开讨论会对其他开发人员有所帮助。)