【问题标题】:Database_cleaner with Rails, Rspec, Capybara. Annoying Deletion. How to control them?带有 Rails、Rspec、Capybara 的 Database_cleaner。烦人的删除。如何控制它们?
【发布时间】:2013-08-14 16:07:24
【问题描述】:

为了简单起见,我有一个模型 Canvas 和一个模型 Block。

在我的每个画布视图(这只是一个基本表格)上,我都有一些用于更新某些块内容的表单。

我想用 RSPEC 和 Capybara 测试更改是否正确提交。

所以我有这条线:

page.driver.execute_script("document.getElementById('block_#{(index+1).to_s}').submit();")

发送到我的 BlocksController

class BlocksController < ApplicationController
  def update
    b=Block.find_by_id_case_and_canvas_id(params[:block][:id_case], params[:block][:canvas_id]) 
    b.update_attributes(params[:block])
    redirect_to "/canvas/"+b.canvas_id.to_s
  end
end

我可以向您保证,我的画布视图和所有控制器/模型都可以正常工作。

但测试失败并出现此错误:

NoMethodError: undefined method `update_attributes' for nil:NilClass

所以我查看了我的测试日志,发现 Database_cleaner 似乎在我完成工作之前删除了一些表:

Processing by BlocksController#update as HTML
  Block Load (0.4ms)  SELECT "blocks".* FROM "blocks" WHERE "blocks"."canvas_id" = 1 AND "blocks"."id_case" = 1 LIMIT 1
  Parameters: {"utf8"=>"✓", "block"=>{"content"=>"1234567890", "id_case"=>"1", "canvas_id"=>"1"}, "id"=>"1"}
   (141.8ms)  DELETE FROM "blocks";
  Block Load (0.5ms)  SELECT "blocks".* FROM "blocks" WHERE "blocks"."id_case" = 1 AND "blocks"."canvas_id" = 1 LIMIT 1

如您所见,大多数情况下,更新请求甚至都没有尝试过。 (我通过一次又一次地运行测试看到了它)。

所以我的问题是,有人知道如何延迟这些删除吗?

非常感谢!

PS:

Database Cleaner 的配置与此链接一样:

http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

我曾多次尝试改变策略,但没有任何帮助。

【问题讨论】:

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


    【解决方案1】:

    您的测试用例不应依赖于其他测试用例创建的数据。您的所有测试都必须能够独立进行。

    当您使用DatabaseCleaner 时,您必须为特定测试引导所有需要的数据。 通常可以使用before块或let来描述。

    因此,在您的情况下,您必须使用 factory_girl(如果您正在使用它)或照常创建 Block 实例:

    FactoryGirl.create :block, canvas_id: 1, case_id: 1
    # or
    Block.create canvas_id: 1, case_id: 1
    

    提示: Capybara 2.x 有方法的别名:

    before => background

    let => given

    【讨论】:

      【解决方案2】:

      您的问题可能与测试被包装在数据库事务中这一事实有关,因此在它之外运行的任何进程(如 selenium)都看不到它。您应该将 js 测试配置为通过截断策略进行清理:

      首先,如果你使用 ActiveRecord,设置:

      config.use_transactional_fixtures = false
      

      并且配置如下(基本上,在可能的情况下设置:transaction 策略,并仅将:truncation 用于:js 测试):

      config.before(:suite) do
        DatabaseCleaner.clean_with(:truncation)
      end
      
      config.before(:each) do
        DatabaseCleaner.strategy = :transaction
      end
      
      config.before(:each, :js => true) do
        DatabaseCleaner.strategy = :truncation
      end
      
      config.before(:each) do
        DatabaseCleaner.start
      end
      
      config.after(:each) do
        DatabaseCleaner.clean
      end
      

      这取自(您可以在那里看到更多信息):

      http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

      【讨论】:

        猜你喜欢
        • 2012-08-26
        • 1970-01-01
        • 2013-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        相关资源
        最近更新 更多