10

私は誓いを使ってテストしているエクスプレスサーバーを持っています。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に変換するつもりですが、今のところ、ドキュメントからの学習モードのimとして、すべてjsで!

4

1 に答える 1

2

ちょうど昨夜私があなたがやりたいことをしたので、それは興味深い質問です。私はあなたが示したもののようにたまたま書かれた小さなCoffeScriptNode.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にはまだ「良いデザイン」がないのではないかと思います。それらは真新しい、非常に革新的な技術です。もちろん、「何かがおかしいと感じる」こともあります。このような状況では、2人の異なる人がデザインを気に入らずに変更しました。「間違った道」を感じることはできますが、それはすでに「正しい道」があるという意味ではありません。要約すると、私たちはあなたの開発においていくつかの「正しい方法」を発明しなければならないと信じています:)

(しかし、物事を行うための良い方法についても尋ねることは良いことです。たぶん誰かが良い考えを持っていて、公開討論は他の開発者にとって役立つでしょう。)

于 2011-08-17T11:35:16.760 に答える