Каков правильный способ запуска вашего сервера из обета для тестирования?

У меня есть экспресс-сервер, который я тестирую с помощью обета. Я хочу запустить сервер из набора тестовых наборов, так что мне не нужно, чтобы он работал в фоновом режиме, чтобы тестовый набор работал, тогда я могу просто создать задачу торта, которая запускает сервер, и проверяет его на изоляция.

В 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 сервер в вышеприведенном тесте, он автоматически начинает запускать сервер, а тесты запускаются и проходят, что отлично, но я не чувствую, что делаю это "правильно".

У меня нет большого контроля при запуске сервера, и что произойдет, если я хочу настроить сервер для указания на "тестовую" среду, а не на стандартную, или изменить уровень ведения журнала по умолчанию для тестирования im?

PS Я собираюсь превратить свои обеты в Coffeescript, но на данный момент все это в js как im в режиме обучения из документов!

Ответ 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-node и Zombie. 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 пока нет "хорошего дизайна". Это совершенно новые, очень инновационные технологии. Конечно, мы можем "почувствовать, что что-то не так" - как в такой ситуации, когда двум различным людям не нравился дизайн и он менял. Мы можем чувствовать "неправильный путь", но это не значит, что есть "правильный путь". Подводя итог, я считаю, что нам придется изобретать некоторые "правильные пути" в вашем развитии:)

(Но хорошо спросить о хороших способах делать вещи. Возможно, у кого-то есть хорошая идея, и общественное обсуждение будет полезно для других разработчиков.)