2012-10-22 55 views
5

Tôi đã đặt đoạn mã sau vào tập tin config/environments/test.rb tôi:default_url_options Thiết trong môi trường thử nghiệm dường như không làm việc

config.action_mailer.default_url_options = { :host => "localhost:3000" } 

tuy nhiên khi tôi chạy thử nghiệm của tôi, tất cả các tuyến sử dụng http://test.host. Tôi đang cố gắng để làm việc với một API mà sẽ không chấp nhận http://test.host như một URI gọi lại hợp lệ, vì vậy tôi cần phải thay đổi điều này để nhận được phản hồi API đúng cách. Bất kỳ ý tưởng tại sao điều này không hoạt động? (Tôi đang sử dụng RSpec, Guard và Spork trong bộ thử nghiệm của mình).

EDIT: Có thể có liên quan - điều này đang được thực hiện bên trong thông số bộ điều khiển.

EDIT2: Dường như nó thay đổi sau một yêu cầu được thực hiện thông qua get, post vv Chạy đoạn mã sau trong bài kiểm tra:

Rails.logger.debug users_url 
get 'http://google.com' 
Rails.logger.debug users_url 

sẽ cho kết quả sau:

http://localhost:3000/users 
...get request related response here 
http://google.com/users 

Trả lời

10

Ngày nay, bạn có thể chỉ cần đặt chúng trong bạn test.rb như vậy:

Rails.application.routes.default_url_options[:host]= 'localhost:3000' 
+0

Xác nhận làm việc trong Rails 3.0 – parhamr

+0

Chấp nhận dựa trên nhận xét của @ parhamr. – Nick

0

Bạn đang chạy thử nghiệm như thế nào? Có thể phụ thêm RAILS_ENV=test có thể hữu ích.

+0

Ý anh là gì bằng cách thêm 'RAILS_ENV = test'? 'ENV [" RAILS_ENV "]' là '" kiểm tra "' rồi.Như đã đề cập, tôi đang chạy các thử nghiệm với RSpec, Guard và Spork. Tôi chỉ chạy 'bundle exec guard' và nó tải lên máy chủ Spork, nó sẽ tự động chạy các kiểm tra RSpec. – Nick

0

Từ kinh nghiệm của tôi, url_options sẽ không được chuyển vào các bài kiểm tra mà không có chút hack.

Xem ví dụ:

tôi đã thường xuyên gặp phải vấn đề này khi cố gắng thiết lập miền địa phương trong kiểm tra. Tuy nhiên, tôi chưa bao giờ sử dụng mailer hành động, vì vậy có thể có một cách đơn giản hơn để làm điều đó.

Giải pháp mà tôi đã tìm thấy để đặt ngôn ngữ mặc định trong url_options chỉ là patch actiondispatch và buộc nó sử dụng bất kỳ ngôn ngữ nào tôi muốn. Bạn có thể thích ứng này cho trường hợp của bạn theo cách này:

class ActionDispatch::Routing::RouteSet 
    def url_for_with_default_url_options(options) 
    url_for_without_default_url_options(options.merge(:host => "localhost:3000")) 
    end 

    alias_method_chain :url_for, :default_url_options 
end 

Tôi đặt mã trong một tập tin trong spec/hỗ trợ vì vậy nó được sử dụng trong các thử nghiệm rspec và tôi cũng yêu cầu nó từ tập tin env.rb của tôi vì vậy tôi có thể sử dụng nó trong thử nghiệm dưa chuột là tốt.

Hãy nhớ rằng điều này sẽ vá nó ở mọi nơi, trong cả mã thử nghiệm và mã thực tế đang chạy trong kiểm tra và nó sẽ ghi đè bất kỳ cài đặt nào khác cho khóa :host mà bạn cố gắng truyền vào. sửa chữa trên đầu trang của các tùy chọn được chuyển vào url_for). Trong trường hợp của bạn, tôi tin rằng đó không phải là một vấn đề.

vá khỉ không phải là một giải pháp rất thanh lịch, mặc dù, và tôi sử dụng này sau khi mọi thứ khác thất bại. Bạn có thể tìm thấy một giải pháp đơn giản hơn cho hành động gửi thư.

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