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

ご覧のとおり、ほとんどの場合、UPDATE 要求は試行されません。(何度も何度もテストを実行することで、一度見ました)。

だから私の質問は、誰かがそれらの削除を遅らせる方法を知っていますか?

本当にありがとうございました !

PS :

データベースクリーナーは、このリンクのように構成されています:

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

戦略を何度も変更しようとしましたが、何も役に立ちませんでした。

4

2 に答える 2

2

テスト ケースは、別のテスト ケースによって作成されたデータに依存してはなりません。すべてのテストは、独立して動作できる必要があります。

使用しDatabaseCleanerているように、特定のテストに必要なすべてのデータをブートストラップする必要があります。before通常はblock やで記述できます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

あなたの問題は、テストがデータベース トランザクションでラップされているという事実に関連している可能性があるため、その外部で実行されているプロセス (セレンなど) はそれを認識しません。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 に答える