2013-07-09 21 views
5

Vì vậy, tôi đã đấu tranh với điều này một thời gian và tôi dường như không thể hiểu được những gì đang xảy ra. có thể có thể gây ra vấn đề này.Các thử nghiệm sử dụng rspec, capybara và poltergeist trả lại các ảnh chụp màn hình html và rỗng rỗng

Tôi khá mới đối với Ruby và Rails, cũng như phát triển thử nghiệm/hành vi và đang cố gắng viết một số thử nghiệm (trình duyệt) bằng PhantomJS thông qua Poltergeist, sử dụng Rspec và Capybara. Tôi tin rằng một số người cũng gọi các bài kiểm tra tích hợp này (họ có thể là từ một số quan điểm), nhưng đó là một cuộc thảo luận hoàn toàn khác.

Tôi có một tính năng thực sự đơn giản mà tôi không thể có được để làm những gì tôi muốn:

require 'feature_helper' 

feature 'Logging in', :js => true do 

    scenario 'with incorrect credentials' do 
    visit '/login' 
    puts page.html 
    save_and_open_page 
    page.driver.render('_screenshot.png', :full => true) 
    page.html.should have_selector("title", :text => "hi") 
    end 

end 

So. Đơn giản, đúng. Nó chỉ cần đi đến /login và ném nội dung HTML vào tôi, cũng như tôi muốn xem trang bằng cách sử dụng save_and_open_page và tôi muốn nó chụp ảnh màn hình. Tôi đã thêm một đơn giản should have_selector để thử nghiệm không thành công để có thêm phản hồi.

Nội dung tương đối của feature_helper.rb tôi:

require 'spec_helper' 
require 'capybara/rspec' 
require 'capybara/rails' 
require 'capybara/poltergeist' 
include Capybara::DSL 

Capybara.register_driver :poltergeist do |app| 
Capybara::Poltergeist::Driver.new(app, { 
     :debug => true, 
     :inspector => true 
    }) 
end 
Capybara.default_driver = :poltergeist 
Capybara.javascript_driver = :poltergeist 

FakeWeb.allow_net_connect = %r[^https?://(127.0.0.1|localhost)] # allow phantomjs/poltergeist requests 

DatabaseCleaner.strategy = :truncation 

RSpec.configure do |config| 
    config.before :each do 
     # Set the hostname to something with test 
     @host = "test.iome:3003" 
     host! @host 
     Capybara.default_host = Capybara.app_host = "http://#{@host}/" 
     Capybara.server_port = 3003 
     Capybara.reset_sessions! 

     # Start the database cleaner 
     config.use_transactional_fixtures = false 
     DatabaseCleaner.start 
    end 

    config.after :each do 
     DatabaseCleaner.clean 
    end 
end 

Và cũng spec_helper.rb tôi:

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'pry' 

require 'fakeweb' 
FakeWeb.allow_net_connect = false 

Đó là tất cả khá đơn giản.

Bây giờ, trong giao diện điều khiển của tôi, tôi thấy như sau:

{"name"=>"visit", "args"=>["http://test.iome:3003//login"]} 
{"response"=>{"status"=>"fail"}} 
{"name"=>"body", "args"=>[]} 
{"response"=>"<html><head></head><body></body></html>"} 
<html><head></head><body></body></html> 
{"name"=>"body", "args"=>[]} 
{"response"=>"<html><head></head><body></body></html>"} 
{"name"=>"render", "args"=>["_screenshot.png", true]} 
{"response"=>true} 
{"name"=>"body", "args"=>[]} 
{"response"=>"<html><head></head><body></body></html>"} 

Ngoài ra, các ảnh chụp màn hình chỉ là một trang trắng và trống rỗng. Khi tôi kết thúc tệp log/test.log của mình, tôi không thấy rằng yêu cầu đang được thực hiện. Tôi đã thử thay đổi phương thức visit thành get và điều đó sẽ thực hiện yêu cầu, nhưng sẽ không thay đổi bất kỳ kết quả nào.

Tôi đã hoàn toàn cạn kiệt ý tưởng về những gì này có thể và nó thay vì bực bội :(thông tin

cuối cùng sau đó về các phiên bản:

  • rspec 2.10.0
  • Capybara 1.1.4
  • poltergeist 1.0.3
  • ruby ​​1.8.7
  • ray 3.2.13

Thật không may, chúng tôi vẫn đang ở mức ruby ​​1.8.7, nhưng đang nỗ lực để tăng phiên bản đó. Tuy nhiên, tôi nghĩ rằng điều này không ảnh hưởng đến các bài kiểm tra.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+0

Nếu bạn chỉ cần truy cập trình duyệt và nhập URL (tức là http: //test.iome: 3003/'), bạn có nhận được phản hồi không? –

+0

Khi tôi chạy thử nghiệm: có. Tôi dường như có thêm một chút nữa. Đó là một ngày mới vì vậy những điều mới đang xảy ra :) Tôi tin rằng các cổng được sử dụng cho các bài kiểm tra vẫn còn được sử dụng, gây ra các ứng dụng để timeout lúc khởi động. Dường như nginx vẫn đang chạy. Thuộc tính 'page.html' cũng có nội dung ngay bây giờ. Tuy nhiên, trong khi một tập tin ảnh chụp màn hình đã được thực hiện nhưng đã được trống trước, nó bây giờ không tạo ra một tập tin cả. Ngoài ra, tôi thêm một số thông tin vào cơ sở dữ liệu cần thiết để đăng nhập, nhưng thông tin này không có sẵn cho ứng dụng. Sẽ cho bạn biết thông tin cập nhật. – Mark

+0

Bạn có thể thêm mã cho hành động điều khiển của mình không? Tôi đang gặp vấn đề tương tự và muốn so sánh! : D –

Trả lời

1

Vì vậy, cuối cùng tôi đã nhận được sự trợ giúp từ đồng nghiệp và chúng tôi đã cố gắng khắc phục. Chúng tôi đã sử dụng miền lvh.me cho điều này vì mọi yêu cầu đối với miền đó sẽ giải quyết trong localhost, cho phép bạn sử dụng tên miền phụ mà không gặp sự cố. Bạn cũng có thể sử dụng hostname.127.0.0.1.xip.io cho việc này.

spec_helper.rb chúng tôi bây giờ trông như thế này:

# Use capybara in combination with poltergeist for integration tests 
require 'capybara/rails' 
require 'capybara/rspec' 
require 'capybara/poltergeist' 
require 'rack_session_access/capybara' 
Capybara.default_driver = :poltergeist 
Capybara.always_include_port = true 
Capybara.app_host = 'http://application-test.lvh.me' # Any lvh.me domain resolves to localhost 
Capybara.default_wait_time = 8      # How long capybara should look for html elements 

require 'vcr' 
VCR.configure do |config| 
    config.cassette_library_dir = 'spec/vcr_cassettes' 
    config.hook_into :fakeweb 
    config.ignore_localhost = true 
    config.configure_rspec_metadata! 
    config.ignore_hosts 'codeclimate.com' 
end 

require 'fakeweb' 
FakeWeb.allow_net_connect = false 

Bởi vì chúng ta nối trong VCR để ghi lại bất kỳ yêu cầu đi ra ngoài trong suốt thời gian đầu tiên của các cuộc thử nghiệm tích hợp, tất cả các xét nghiệm hội nhập của bạn, hoặc các tính năng, nên chứa mã này :

before(:all) do 
    FakeWeb.allow_net_connect = true 
end 

after(:all) do 
    FakeWeb.allow_net_connect = false 
end 

Nếu bạn muốn thay đổi tên miền phụ trong thông số kỹ thuật của bạn, bạn có thể sử dụng như sau:

before(:each) do 
    @original_host = Capybara.app_host 
    Capybara.app_host = 'http://does-not-exist.lvh.me' 
    visit '/login' 
end 

after(:each) do 
    Capybara.app_host = @original_host 
end 

Làm cho ảnh chụp màn hình bây giờ có thể được thực hiện bằng cách sử dụng page.save_screenshot trong thông số kỹ thuật. Hi vọng điêu nay co ich.

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