2013-07-09 58 views
5

私はかなり長い間このことに苦労してきましたが、何がうまくいかないのか分からないようです。この問題を引き起こす可能性があります。rspec、capybara、poltergeistを使ったテストでは、空のHTMLと空のスクリーンショットが返ってくる

私はRubyとRails、テスト/ビヘイビア駆動の開発に比較的新しく、RspecとCapybaraを使用してPhantomJSを使ってPhantomJSを使っていくつかの受け入れ(ブラウザ)テストを書こうとしています。私は、この統合テストをいくつかの観点から呼んでいる人もいると思いますが、それは他の議論の全体です。

私は私がやりたいことを得ることができない、本当にシンプルな機能を持っている:

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がシンプル、右。それはちょうど/loginに行き、私にHTMLの内容を投げるべきであるだけでなく、私はsave_and_open_pageを使用してページを見たいと思って、それはスクリーンショットを撮ることを望みます。私は単純なshould have_selectorを追加し、より多くのフィードバックを得るためにテストが失敗するようにしました。

feature_helper.rbの相対的な内容:

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 

そしてまた私のspec_helper.rb

# 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 

それはすべての非常に単純です。

は今、私のコンソールで、私は以下を参照してください。

{"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>"} 

また、スクリーンショットがちょうど白と空のページです。私の末尾にlog/test.logというファイルがあると、リクエストが実行されているとは限りません。私は方法visitgetに変更しようとしましたが、それはリクエストを行いますが、結果は変更されません。

私は完全にこれは何ができるかのアイデアが不足してきたし、それはかなりイライラ:(

最終情報を、その後のバージョンについて

  • RSpecの2.10.0
  • カピバラ1.1.4
  • ポルターガイスト1.0.3
  • ルビー1.8.7
  • レール3.2.13

残念ながら、私たちはまだルビー1.8.7ですが、そのバージョンをバンプすることに取り組んでいます。それでも、私はこれがテストに影響を与えるべきではないと思います。

ご協力いただければ幸いです!

+0

ブラウザにアクセスしてURL(つまり、http://test.iome:3003/')を入力するだけで応答が得られますか? –

+0

私はテストを実行しています:はい。私はちょっと今でも少し手に入るようです。新しいことが起きている新しいことです:)テストに使用されたポートがまだ使用中で、アプリケーションが起動時にタイムアウトする原因になると思います。それはnginxがまだ走っていたようでした。 'page.html'属性にもコンテンツがあります。しかし、スクリーンショットファイルは作成されていましたが、以前は空白だったのですが、今はファイルを作成しません。また、ログインに必要な情報をデータベースに追加しますが、この情報はアプリケーションでは使用できません。更新情報をお知らせします。 – Mark

+0

コントローラアクションのコードを追加できますか?私は同じ問題を経験しており、比較したい! :D –

答えて

1

最終的に私は同僚から助けを得て、それを修正することができました。そのためにはlvh.meドメインを使用しました。そのドメインへのリクエストはlocalhostで解決されるため、問題なくサブドメインを使用できます。あなたはおそらくこれにhostname.127.0.0.1.xip.ioを使用することもできます。

当社spec_helper.rbは次のようになります。

# 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 

我々は統合テストの最初の実行中に出て行くすべての要求を記録するためにVCRに引っ掛かっているので、すべての統合テスト、または特徴は、このコードが含まれている必要があります:

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 
:あなたはあなたのスペック中にサブドメインを変更したい場合は

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

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

は、次のものを使用することができます

スペック中にpage.save_screenshotを使用してスクリーンショットを作成できるようになりました。お役に立てれば。

関連する問題