没有用Capybara测试Devise

Dun*_*yne 12 testing capybara ruby-on-rails-3

我正在使用Devise构建一个Rails 3应用程序,使用Capybara进行UI测试.以下测试失败:

class AuthenticationTest < ActionController::IntegrationTest

  def setup
    @user = User.create!(:email => 'test@example.com', 
                         :password => 'testtest', 
                         :password_confirmation => 'testtest')
    @user.save!
    Capybara.reset_sessions!
  end

  test "sign_in" do
    # this proves the user exists in the database ...
    assert_equal 1, User.count
    assert_equal 'test@example.com', User.first.email

    # ... but we still can't log in ...
    visit '/users/sign_in'
    assert page.has_content?('Sign in')
    fill_in :user_email, :with => 'test@example.com'
    fill_in :user_password, :with => 'testtest'
    click_button('user_submit')

    # ... because this test fails
    assert page.has_content?('Signed in successfully.')
  end

end
Run Code Online (Sandbox Code Playgroud)

......但我不明白为什么.从代码中可以看出,用户正在数据库中创建; 我正在使用相同的方法来创建用户,就像我在seeds.rb中所做的那样.

如果我通过调试器运行测试,我可以在数据库中看到用户并验证页面是否正在加载.但是身份验证仍然失败; 我可以验证这一点,因为如果我更改断言以测试失败案例,则测试通过:

# verify that the authentication actually failed
assert page.has_content?('Invalid email or password.')
Run Code Online (Sandbox Code Playgroud)

我已经习惯了Rails 2,并使用Selenium进行这种测试,所以我怀疑我做的事情很糟糕.有人可以指点我这里正确的方向吗?

小智 24

我遇到了同样的问题并找到了一个解决方案的线程:

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end
Run Code Online (Sandbox Code Playgroud)

要使DatabaseCleaner工作,您需要包含database_cleanergem.如果您之前没有使用它,则可能需要rake db:test:prepare在重新运行测试之前.我希望这也适合你!