2012-02-01 13 views
4

私はCapybaraをRailsで使用する上で問題があります。それだけで面白いテストのことをテストします。 OK、付属のコードには同等のテストがいくつかあります。最初のものは、Railsに付属のshoulda-context + Test :: Unitで作られています。 2回目のテストは、カピバラと文脈が必要です。Capybaraの問題:@requestはActionDispatch :: Requestである必要があります

require 'integration_test_helper' 

class UsersTest < ActionDispatch::IntegrationTest 
    fixtures :all 

    context "signup" do 

    context "failure" do 

     setup do 
     @attr = { :name => "", :email => "", :password => "", :password_confirmation => "" } 
     end 

     should "not make a new user" do 
     assert_no_difference 'User.count' do 
      post_via_redirect "users", :user =>@attr # enviem les dades d'un nou usuari via create (POST /users) 
      assert_template 'users/new'  # ens retorna a users/new, que significa que no s'ha creat l'usuari 
      assert_select "div#error_explanation" # comprovem que conte missatges d'error 
     end 
     end 

     should "not make a new user (capybara)" do 
     assert_no_difference 'User.count' do 
      visit '/signup' 
      fill_in 'Name', :with => @attr[:name] 
      fill_in 'Email', :with => @attr[:email] 
      fill_in 'Password', :with => @attr[:password] 
      fill_in 'Confirmation', :with => @attr[:password_confirmation] 
      click_button 'Sign Up!' 
      assert_template 'users/new'  # ens retorna a users/new, que significa que no s'ha creat l'usuari 
      assert_select "div#error_explanation" # comprovem que conte missatges d'error 
     end 
     end 
    end 
end 

最初のものはOK動作しますが、1は、このエラーメッセージスローカピバラ:

================================================================================ 
Error: 
test: signup failure should not make a new user (capybara). (UsersTest): 
ArgumentError: @request must be an ActionDispatch::Request 
    test/integration/users_test.rb:30:in `block (4 levels) in <class:UsersTest>' 
    test/integration/users_test.rb:23:in `block (3 levels) in <class:UsersTest>' 
================================================================================ 

が必要* integration_test_helper.rb *ファイルは、私の周りグーグルで見つけたすべてのsuposedソリューションのアキュムレータでありますそれは私にとってはうまくいかない。

require 'test_helper' 
require 'capybara/rails' 
require 'database_cleaner' 

# Transactional fixtures do not work with Selenium tests, because Capybara 
# uses a separate server thread, which the transactions would be hidden 
# from. We hence use DatabaseCleaner to truncate our test database. 
DatabaseCleaner.strategy = :truncation 

class ActionDispatch::IntegrationTest 
    # Make the Capybara DSL available in all integration tests 
    include Capybara::DSL 

    # Stop ActiveRecord from wrapping tests in transactions 
    self.use_transactional_fixtures = false 

    teardown do 
    DatabaseCleaner.clean  # Truncate the database 
    Capybara.reset_sessions! # Forget the (simulated) browser state 
    Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver 
    end 
end 

誰か解決策はありますか?私はwebratのような別の統合frmaworkを試すべきですか?

私のセットアップは次のとおりです。また、

[email protected]:~/Desenvolupament/Rails3Examples/ror_tutorial$ rake about 
About your application's environment 
Ruby version    1.9.2 (x86_64-linux) 
RubyGems version   1.8.15 
Rack version    1.3 
Rails version    3.1.3 
JavaScript Runtime  therubyracer (V8) 
Active Record version  3.1.3 
Action Pack version  3.1.3 
Active Resource version 3.1.3 
Action Mailer version  3.1.3 
Active Support version 3.1.3 
Middleware    ActionDispatch::Static, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000002b9bac0>, Rack::Runtime, Rack::MethodOverride, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::RemoteIp, Rack::Sendfile, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, ActionDispatch::Head, Rack::ConditionalGet, Rack::ETag, ActionDispatch::BestStandardsSupport 
Application root   /mnt/dropbox/Dropbox/DESENVOLUPAMENT/Rails3Examples/ror_tutorial 
Environment    development 
Database adapter   sqlite3 
Database schema version 20120127011330 

shoulda-context (1.0.0) 
capybara (1.1.2) 

おかげ

答えて

11

あなたは、あなたのテストの種類を混合し、テストの間違ったタイプでテンプレートを主張しようとしています。機能テストでは、コントローラーを直接テストするだけで、実際にはユーザーのやりとりをシミュレートしないで、テンプレートをアサートする必要があります。

Capybaraは、基本的に統合テストを意味します。これは基本的にブラウザと対話するエンドユーザーの視点からテストを実行することです。これらのテストでは、エンドユーザーがアプリケーションの深い部分を認識できないため、テンプレートを宣言するべきではありません。代わりにあなたがテストするべきことは、アクションがあなたを正しい経路に導くことです。 @Ryanあなたのヒントについてhttps://github.com/jnicklas/capybara/issues/240

+0

私はあなたの指示にしたがって修正しようとしましたが、 'current_path.should == new_user_path'は動作しません。私はそれがRSpecだと私はRSpecを使用していないと思う。また、 'assert current_path、 '\ signup''は動作しません。どのように私はcurrent_pathをチェックできますか? –

+0

実際、ええと、*合致者はRSpecの一部です。私の間違い。しかし、 'current_path'は' include Capybara :: DSL'に含まれているDSLの一部として定義されています。 'current_path'を使用しようとすると、定義されていないエラーが発生していますか? – Ryan

+0

私はあなたに同意していませんが、なぜrspecがrequest specsのために 'render_template'と' redirect_to'メソッドを具体的に記述しているのかを説明できますか?(この好きなページで)(https://www.relishapp.com/rspec/rspec -rails/docs/request-specs/request-spec)?彼らは私のために働いていない(OPと同じエラーを受け取る)と私はなぜ好奇心です。 – bricker

0

ありがとう:https://github.com/jnicklas/capybara

公式の説明あなたの問題のために:

current_path.should == new_user_path 
page.should have_selector('div#error_explanation') 

は "DSL" のgitのカピバラのREADMEセクションを参照してください。私はいくつかのRSpec統合テストの例を http://ruby.railstutorial.org/chapters/sign-up#sec:rspec_integration_testsからTest :: Unit + Capybaraに翻訳する方法を解明しようとしていました。元RSpecの統合テストがそう

it "should not make a new user" do 
    lambda do 
     visit signup_path 
     fill_in "Name",   :with => "" 
     fill_in "Email",  :with => "" 
     fill_in "Password",  :with => "" 
     fill_in "Confirmation", :with => "" 
     click_button 
     response.should render_template('users/new') 
     response.should have_selector("div#error_explanation") 
    end.should_not change(User, :count) 
    end 
end 

た、あなたの答えの後、私は戻ってこれに来ることを知っているだろうから、元の例では、私の完全を期すためresponse.should render_template('users/new')

+0

特定の条件下では、特定のテンプレートがインテグレーションテストでレンダリングされたことをチェックすることは可能です*。私はそうするのは賢明ではないという意見しかない。 – Ryan

1

を含むべきではないということsuposeリンクを繰り返して:

これはテストユニットとカピバラを使用している人も、これは良いプライマーです:from techiferous。これは良いですassert page.has_content?("something")

の使用は、試験ルートの使用だけでなく、assert_equal some_path, current_pathする

注意してください。

これは最も完全なのかわかりませんが、それ以上のものは必要ありません。

関連する問題