1

为了简单起见,我有一个模型 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:

数据库清理器的配置与此链接中的一样:

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

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

4

2 回答 2

2

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

当您使用DatabaseCleaner时,您必须引导特定测试所需的所有数据。通常可以使用beforeblock 或来描述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

于 2013-12-09T11:07:53.260 回答
1

您的问题可能与测试被包装在数据库事务中这一事实有关,因此在它之外运行的任何进程(如 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/

于 2013-12-09T10:54:43.843 回答