2012-04-15 33 views
7

Tôi đang viết một thư viện để bọc chức năng của tsung theo cách có thể được sử dụng tốt hơn bởi các ứng dụng đường ray. Tôi muốn viết một số xét nghiệm hội nhập đó đun sôi xuống như sau:Khởi chạy một máy chủ web bên trong các thử nghiệm ruby ​​

  1. ra mắt một máy chủ web đơn giản
  2. chạy tsung-máy ghi âm thông qua thư viện
  3. ra mắt selen, với một hồ sơ firefox cấu hình để sử dụng tsung proxy, và có điều này lấy một trang từ máy chủ đưa ra ở bước 1
  4. kiểm tra thư viện ghi lại (nó tồn tại, nó ở đúng vị trí, vv)

Đối với bước 1, trong khi tôi có thể khởi động một vanil ứng dụng la rails bên ngoài (ví dụ: %x{rails s}), tôi chắc chắn có một cách tốt hơn để lập trình tạo một máy chủ web đơn giản phù hợp để thử nghiệm.

tl; dr - Cách khởi chạy một máy chủ web đơn giản trong chương trình thử nghiệm là gì?

+0

Chỉ cần sử dụng Rack ?. –

+0

@NiklasB. Tôi đã nghĩ rằng sẽ làm việc tốt, nhưng tôi không có một thời gian dễ dàng tìm kiếm một ví dụ (các bài kiểm tra rack sử dụng mocks từ những gì tôi có thể nói). –

+0

Hm, thật không may, tôi không thể chỉ cho bạn một ví dụ tối thiểu, nhưng tôi chắc chắn rằng capybara sử dụng thông số này cho thông số kỹ thuật của nó. Hãy xem triển khai máy chủ tại https://github.com/jnicklas/capybara/blob/master/lib/capybara/server.rb và thông số kỹ thuật tại https://github.com/jnicklas/capybara/blob/master /spec/server_spec.rb, chúng khá thông tin :) –

Trả lời

4

Capybara sử dụng một máy chủ rack ad-hoc cho thông số kỹ thuật của nó:

Bất kỳ ứng dụng rack (bao gồm cả các ứng dụng Rails) có thể được phân phối bằng hệ thống này, mặc dù cấu hình Rails có thể hơi phức tạp một chút.

+0

Tôi đã sử dụng 'Timeout.timeout (60) {@ server_thread.join (0.1) cho đến khi đáp ứng? } 'mẫu, và nó hoạt động tuyệt vời! CẢM ƠN! –

9

Bạn có thể cuộn máy chủ đơn giản của riêng mình. Dưới đây là một ví dụ nhanh bằng mỏng và rspec (những đá quý, cộng với rack, phải được cài đặt):

# spec/support/test_server.rb 
require 'rubygems' 
require 'rack' 

module MyApp 
    module Test 
    class Server 
     def call(env) 
     @root = File.expand_path(File.dirname(__FILE__)) 
     path = Rack::Utils.unescape(env['PATH_INFO']) 
     path += 'index.html' if path == '/' 
     file = @root + "#{path}" 

     params = Rack::Utils.parse_nested_query(env['QUERY_STRING']) 

     if File.exists?(file) 
      [ 200, {"Content-Type" => "text/html"}, File.read(file) ] 
     else 
      [ 404, {'Content-Type' => 'text/plain'}, 'file not found' ] 
     end 
     end 
    end 
    end 
end 

Sau đó, trong bạn spec_helper:

# Include all files under spec/support 
Dir["./spec/support/**/*.rb"].each {|f| require f} 

# Start a local rack server to serve up test pages. 
@server_thread = Thread.new do 
    Rack::Handler::Thin.run MyApp::Test::Server.new, :Port => 9292 
end 
sleep(1) # wait a sec for the server to be booted 

này sẽ phục vụ bất kỳ tập tin mà bạn lưu trữ trong spec/support danh mục. Bao gồm cả chính nó. Đối với tất cả các yêu cầu khác, nó sẽ trả lại 404.

Về cơ bản, điều này giống như những gì được đề cập trong câu trả lời trước, trừ đi rất nhiều sự tinh tế.

+0

Có thể có một mối quan tâm an ninh ở đây ... chỉ để được an toàn Tôi muốn thay đổi File.exists? line to: 'File.exists? (tập tin) && File.dirname (tập tin) == @ root' – etipton

1

stub_server là một máy chủ thử nghiệm thực sự có thể phục vụ các câu trả lời được xác định trước và dễ dàng quay lên ... đi kèm với hỗ trợ ssl.

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