我想在流程中测试一个简单的登录,这需要测试数据库中的现有用户。
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方法不能创建用户?
答案 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