2011-08-17 6 views
10

私は、誓いを使ってテストしている高速サーバーを持っています。テストスイートが動作するようにバックグラウンドで実行する必要がないように、サーバーを実行してテストしているケーキタスクを作成できます分離。テスト用に誓約からサーバーを起動する正しい方法は何ですか?

私が(表現)サーバー、次のようにルートを設定し、app.listen(ポート)と呼ばれる、それを構成し作成した server.coffee

:私は私の簡単なroutes-test.js

# 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 

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); 

abovでI requireサーバーrespondsWith(code)が...誓いドキュメント内の1つの機能的に似ている

eテストでは、自動的にサーバーの稼働を開始し、テストが実行され、パスします。これは素晴らしいことですが、私は「正しい」方法でやっているように感じません。

私は、サーバーの起動時期を管理していませんし、デフォルトの設定ではなく「テスト」環境を指すようにサーバーを構成する場合や、imテスト時のデフォルトのログ出力レベルを変更する場合はどうなりますか?

PS私は誓約をCoffeescriptに変換しようとしていますが、今はそのすべてがドキュメントの学習モードのIMとしてjsにあります!

+1

[Pact](http://reid.github.com/pact/)を見てみるとよいでしょう - それは、誓約を使ってHTTPサーバーをテストするためです。 – Skilldrick

+0

ありがとうございますSkilldrick、Pactをチェックします! – cjroebuck

答えて

2

まさに昨晩、私はあなたがしたいことをやったので、面白い質問です。私は、CoffeScript Node.jsという小さなCoffeScriptアプリケーションを用意しています。その後、私は次のよう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にはまだ「良いデザイン」がないと思われます。それらはまったく新しい、非常に革新的な技術です。もちろん、我々は "何かが間違っていると感じる"ことができます - このような状況では、2人の異なる人々がデザインを気に入らず、変更しました。私たちは「間違ったやり方」を感じることができますが、それはすでに「正しい道」があることを意味するものではありません。要約すると、私はあなたの開発に「正しい方法」をいくつか作り出さなければならないと信じています:)

(しかし、良いことをやっていることについても聞くのは良いことです。 )

+1

本当にありがとうございます。あなたはこの技術で正しいことをする方法がないというのは間違いありませんが、「より良い」方法があることを知っていました。残念ながら、この特定の問題については、瞬間、少なくとも私は1つを見つけることができませんでした。 – cjroebuck

+0

私はあなたの状況を知っている、私はいつも同じ問題があります。幸いなことに、あなたの質問で今この問題の例がWebに掲載されています:) – brandizzi

+0

サーバーがcluster.fork()を実行している場合、これは機能しません。複数のサーバーが実行されます。 – haijin

関連する問題