2011-08-17 18 views
10

Tôi có một máy chủ tốc độ mà tôi đang thử nghiệm bằng cách sử dụng lời thề. Tôi muốn chạy máy chủ từ bên trong bộ thử nghiệm lời thề, vì vậy tôi không cần phải chạy nó trong nền để bộ thử nghiệm hoạt động, sau đó tôi có thể tạo một tác vụ bánh chạy máy chủ và kiểm tra nó trong cô lập.Cách chính xác để khởi động máy chủ của bạn từ lời thề để thử nghiệm là gì?

Trong server.coffee Tôi đã tạo ra máy chủ (thể hiện), cấu hình nó, thiết lập các tuyến đường và gọi app.listen (port) như thế này:

# 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 

Trong đơn giản routes-test.js của tôi, tôi có:

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

nơi respondsWith(code) cũng tương tự như trong chức năng cho một trong doc nguyện ...

Khi tôi require máy chủ trong abov e kiểm tra, nó sẽ tự động bắt đầu chạy máy chủ và các bài kiểm tra chạy và vượt qua, đó là tuyệt vời, nhưng tôi không cảm thấy như tôi đang làm nó theo cách 'đúng'.

Tôi không có nhiều quyền kiểm soát khi máy chủ bắt đầu và điều gì xảy ra nếu tôi muốn cấu hình máy chủ trỏ đến môi trường 'thử nghiệm' thay vì mặc định, hoặc thay đổi mức ghi mặc định khi thử nghiệm im?

PS Tôi sẽ chuyển đổi lời thề của mình thành Coffeescript nhưng bây giờ tất cả trong js là im trong chế độ học tập từ tài liệu!

+1

Bạn có thể muốn xem [Pact] (http://reid.github.com/pact/) - đó là để kiểm tra các máy chủ HTTP có Vows. – Skilldrick

+0

Cảm ơn Skilldrick, sẽ kiểm tra Pact! – cjroebuck

Trả lời

2

Đó là một câu hỏi thú vị vì chính xác đêm qua tôi đã làm những gì bạn muốn làm. Tôi có một ứng dụng CoffeScript Node.js nhỏ đã xảy ra được viết giống như ứng dụng bạn đã trình bày. Sau đó, tôi refactored nó, tạo ra những điều sau 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 

Bây giờ tôi có một index.coffee (tương đương với bạn server.coffee) đơn giản như:

require('./app').start port:3000 

Sau đó, tôi đã viết một số xét nghiệm sử dụng Jasmine-nodeZombie.js . Khung kiểm tra khác nhau nhưng nguyên tắc giống nhau:

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

Vấn đề là: những gì tôi đã làm và tôi khuyên bạn nên tạo một hàm trong mô-đun khởi động máy chủ. Sau đó, gọi chức năng này bất cứ nơi nào bạn muốn. Tôi không biết nếu nó là "thiết kế tốt", nhưng nó hoạt động và có vẻ dễ đọc và thiết thực đối với tôi.

Ngoài ra, tôi nghi ngờ không có "thiết kế tốt" trong Node.js và CoffeScript. Đó là những công nghệ mới, rất sáng tạo. Tất nhiên, chúng ta có thể "cảm thấy có điều gì đó sai" - như tình huống này, nơi hai người khác nhau không thích thiết kế và thay đổi nó. Chúng ta có thể cảm thấy "sai đường", nhưng nó không có nghĩa là đã có một "con đường đúng đắn" rồi. Tóm lại, tôi tin rằng chúng ta sẽ phải phát minh ra một số "cách thức đúng đắn" trong sự phát triển của bạn :)

(Nhưng tốt hơn là hãy hỏi về cách làm tốt.) sẽ hữu ích cho các nhà phát triển khác.)

+1

cảm ơn rất nhiều, bạn chính xác rằng không có cách 'làm' đúng đắn với công nghệ này, nhưng tôi biết sẽ có cách 'tốt hơn', rất tiếc là không có ví dụ rõ ràng về vấn đề cụ thể này trên web tại thời điểm này, ít nhất tôi không thể tìm thấy. – cjroebuck

+0

Tôi biết tình hình của bạn, tôi luôn có cùng một vấn đề. May mắn thay, câu hỏi của bạn bây giờ đặt một ví dụ về vấn đề này trong trang web bây giờ :) – brandizzi

+0

điều này không hoạt động nếu máy chủ của bạn không cluster.fork(). Nhiều máy chủ sẽ chạy. – haijin

Các vấn đề liên quan