Как правильно запустить ваш сервер из обетов для тестирования? - PullRequest
10 голосов
/ 17 августа 2011

У меня есть экспресс-сервер, который я тестирую с помощью обетов.Я хочу запустить сервер из набора тестов 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

В моем простом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) по функциональности похож на тот, что указан в документе vows ...

Когда я require сервер в приведенном выше тесте,он автоматически запускает сервер, и тесты запускаются и проходят, что замечательно, но я не чувствую, что делаю это «правильно».

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

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

1 Ответ

2 голосов
/ 17 августа 2011

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

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

...