无法使用rspec创建使用capybara进行测试的用户

时间:2014-02-26 19:42:38

标签: ruby-on-rails-3 capybara rspec-rails

我想在流程中测试一个简单的登录,这需要测试数据库中的现有用户。

describe 'Signin page' do
  before :each do
    User.generate(:email => 'automatic_tester@gmail.com', :password => 'palmdrive', :first_name => 'Automatic', :last_name => 'Tester')
  end
  it 'signs in a user', :js => true do 
    signin
    current_path.should == redirect_path    
  end
end

def signin  
  ## Action to sign in the user
end

## Use DatabaseCleaner since selenium driver is used
DatabaseCleaner.strategy = :truncation

RSpec.configure do |config|
  config.use_transactional_fixtures = false
  config.before :each do
    DatabaseCleaner.start
  end
  config.after :each do
    DatabaseCleaner.clean
  end
end

因为创建用户的方式有点复杂,所以我定义了User.generate方法来创建用户。为了确保它实际工作,在带有测试环境的rails控制台中,运行User.generate(:email => 'automatic_tester@gmail.com', :password => 'palmdrive', :first_name => 'Automatic', :last_name => 'Tester')它成功地在数据库中创建了一个用户。注释掉之前:每个,测试套件成功通过。

但是问题是运行上面的代码,测试失败了。这是由于用户无法在数据库中创建。为什么User.generate方法不能创建用户?

2 个答案:

答案 0 :(得分:2)

在spec_helper中添加:

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end

# Forces all threads to share the same connection. This works on
# Capybara because it starts the web server in a thread.
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

解决了这个问题。然后无需使用DatabaseCleaner

答案 1 :(得分:0)

使用create而不是

User.create(:....)

请注意,create将在数据库中创建一条记录。写入数据库是一项昂贵的操作,您可能希望在某些情况下通过使用new而不是create来避免这种情况。

更好的方法是使用工厂。见FactoryGirl https://github.com/thoughtbot/factory_girl