【问题标题】:Rspec and Capybara: saving results to database?Rspec 和 Capybara:将结果保存到数据库?
【发布时间】:2014-07-20 15:12:03
【问题描述】:

我是 RSpec 的新手,一直在尝试为我的网站创建一些测试,用户可以在这些测试上向网站发布预订,然后将其保存到我们的数据库中。我一直在尝试使用 Rspec 和 Capybara 来模拟用户向网站发布预订。我们有一个现有的测试数据库,并且希望在 Rspec 测试结束时将新预留写入数据库,并且在 Rspec 测试结束时删除。

当我们运行代码时会发生以下两种情况之一:要么它“工作”但在数据库中找不到新的预留,要么我们收到此错误:

Failure/Error: Unable to find matching line from backtrace
 ActiveRecord::StatementInvalid:
   Mysql2::Error: This connection is in use by: #<Thread:0x007fb421fd6218 sleep>: SELECT `users`.* FROM `users`  WHERE `users`.`id` = 6  ORDER BY `users`.`id` ASC LIMIT 1
 # ./app/controllers/application_controller.rb:95:in `pass_login_status_to_js'
 # ./app/middleware/search_suggestions.rb:12:in `call'

为什么会发生这种情况?我意识到 Capybara 通常并不意味着对数据库进行永久性更改。您推荐其他程序/宝石吗?

我目前有config.use_transactional_fixtures = false,在几个网站的推荐下也添加了以下内容: 类 ActiveRecord::Base mattr_accessor :shared_connection @@shared_connection = 无

  def self.connection
    @@shared_connection || retrieve_connection
  end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 

重申一下,我确实希望 Capybara 写入我的数据库(我们使用 SQL)。我能做些什么不同的事情?和数据库清理器有关系吗?

【问题讨论】:

  • database_cleaner,顾名思义,在测试运行后清理数据库。具体如何取决于您的配置方式。
  • 为什么要在测试运行结束时将数据留在数据库中?

标签: mysql ruby-on-rails rspec capybara database-cleaner


【解决方案1】:

是的,它与database_cleaner 有关。如果您正确设置它,它将在场景之间清理您的数据库,以保持测试隔离。

有几种方法可以做你想做的事:

  1. 您可以明确告诉database_cleaner 不要在场景之间清理某些表:

    DatabaseCleaner.strategy = :transaction, {except: [:countries, :states]} DatabaseCleaner.clean_with(:truncation, {except: [:countries, :states]})

  2. 您可以将代码添加到 before(:each)before(:all)

  3. 您可以将数据添加到一个或多个夹具

只有少数情况下您应该在场景之间共享数据(即国家、州表,它们是#3 的良好候选者)

在任何其他情况下,我建议不要在场景之间共享数据。

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 2015-04-02
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多