【问题标题】:What is the correct way to launch your server from vows for testing?从 vows 启动服务器进行测试的正确方法是什么?
【发布时间】:2011-10-28 20:16:10
【问题描述】:

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

server.coffee 中,我创建了(快速)服务器,对其进行了配置,设置了路由并调用了 app.listen(port),如下所示:

# 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

在我简单的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);

respondsWith(code) 在功能上与誓言文档中的相似...

当我在上述测试中require 服务器时,它会自动开始运行服务器并且测试运行并通过,这很好,但我不觉得我这样做是“正确”的方式。

我无法控制服务器何时启动,如果我想将服务器配置为指向“测试”环境而不是默认环境,或者更改我测试时的默认日志记录级别,会发生什么?

PS 我要将我的誓言转换为 Coffeescript,但现在它全部在 js 中,因为我正处于从文档中学习的模式!

【问题讨论】:

  • 您可能想看看Pact - 它用于使用 Vows 测试 HTTP 服务器。
  • 感谢 Skilldrick,将检查 Pact!

标签: testing node.js coffeescript express vows


【解决方案1】:

这是一个有趣的问题,因为昨晚我做了你想做的事。我有一个小的 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

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

require('./app').start port:3000

然后,我使用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()

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

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

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

【讨论】:

  • 非常感谢,您说得对,使用这项技术没有“正确”的做事方式,但我知道会有“更好”的方式,遗憾的是没有明确的例子目前网络上的这个特殊问题,至少我找不到。
  • 我知道你的情况,我一直有同样的问题。幸运的是,您的问题现在在网络上放了一个这个问题的例子:)
  • 如果您的服务器执行 cluster.fork(),这将不起作用。将运行多个服务器。
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2011-08-01
  • 2013-04-03
相关资源
最近更新 更多