1

私は与えられたテストコードを持っています:


describe 'A new user', js: true do
  before do
    @new_user = Fabricate.build(:user)
  end

  it 'should sign up' do
    #login code
    visit '/'
    click_link 'Login'
    fill_in 'user[email]', :with => @new_user.email
    fill_in 'user[password]', :with => @new_user.password
    click_button 'Login now'
    #login code end

    page.should have_content("Hello #{@new_user.first_name}!")
    current_path.should == dashboard_path
  end

  it 'should receive a confirmation mail' do
    #same login code again
    visit '/'
    click_link 'Login'
    fill_in 'user[email]', :with => @new_user.email
    fill_in 'user[password]', :with => @new_user.password
    click_button 'Login now'

    mail = ActionMailer::Base.deliveries.last
    assert_equal @new_user.email, mail['to'].to_s
  end
end

ここで、さらにテストを追加したいと思います。コードの重複を避けるために、すべてのテストの前にカピバラのログインコードを1回実行するにはどうすればよいですか?1つの解決策は、ログインコードをbeforeメソッドに入れることです。もう1つは、メソッドdo_loginを作成し、その中にコードを配置して、次のようにすべてのテストを実行することです。

it 'should do something after login' do
  do_login
  #test code here
end

しかし、どちらのソリューションでも、コードはすべてのテストで実行され、それは私が望んでいることではありません。ログインコードをに入れてもbefore(:all)機能しません。

カピバラコードを一度実行してから、その後すべてのテストを実行するにはどうすればよいですか?

4

1 に答える 1

2

カピバラコードを一度実行してから、すべてのテストを実行することはできません。あなたはいつも最初から始めます。before(:each)またはhelperメソッドを使用して提案されたソリューションが唯一の可能性です。(いくつかのruby before(:all)を実行することは可能です。たとえば、ここでトランザクションチェックの外部にオブジェクトを作成しますが、Capybaraは実行しません)

仕様を高速化するために、別の仕様でログイン機能をテストしてから、何らかの方法で認証をスタブ化できますが、実装によって異なります。

Deviseを使用している場合は、devise wikiを確認してください:https://github.com/plataformatec/devise/wiki/How-To:-Controllers-tests-with-Rails-3-(and-rspec)

于 2012-09-11T14:20:21.827 に答える