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