1

そのため、私のチームは、Cucumber、Rspec、およびこれらのテスト フレームワークを使用するために必要なすべての gem を使用して、Rails アプリ (調査および軽量の電子記録システム) を追い出しています。私は Jenkins CI サーバーをセットアップする過程にあり、テスト、開発、およびステージング環境全体でデータベースを標準化したいと考えていました (最終的に MySQL を選択しました)。

テスト環境を SQlite から MySQL に切り替えたところ、キャッシング関連のテスト バグがいくつか発見されましたが、ハードコーディングされた ID ではなく相対 ID を使用することで解決しました。例:

describe "#instance_method" do
  before(:each) do
  @survey = FactoryGirl.create(:survey)
  @question_1 = FactoryGirl.create(:question)
  @question_2 = FactoryGirl.create(:question)
  ....
  end
  context "question has no requirements" do
    it "should match" do
      # below breaks under MySQL (and postgres), but not SQlite
      expect { @survey.present_question?(2) }.to be_true
      # always works
      expect { @survey.present_question?(@question_2.id) }.to be_true
    end
  end
end

この 1 つの失敗した仕様を解決した後、テスト スイートを永遠に悩ませてきた無関係な ajax の問題に対処しました。やっとテストの技術をマスターしたと思い、自信を持って走りrakeました。私はこの無愛想な光景に遭遇しました:

スクリーン ショット 2013 年 8 月 20 日午後 8 時 12 分 42 秒

もちろんcucumber features/presenting_default_questions.feature、単独で実行すると緑の雨が降るようになりました。

失敗のシナリオ:

@javascript
Feature: Dynamic Presentation of Questions
  In order to only answer questions that are relevant considering previously answered      questions
  As a patient
  I want to not be presented questions that illogical given my previously answered question on the survey

  Scenario: Answering a question that does not depend on any other questions
    Given I have the following questions:
      | prompt             | datatype | options | parent_id | requirement |
      | Do you like cars?  | bool     |         |           |             |
      | Do you like fruit? | bool     |         |           |             |
    When I visit the patient sign in page
    And I fill out the form with the name "Jim Dog", date of birth "1978-03-30", and gender "male"
    And I accept the waiver
    Then I should see the question "Do you like cars"
    When I respond to the boolean question with "Yes"
    Then I should see the question "Do you like fruit?"
    When I respond to the boolean question with "No"
    Given I wait for the ajax request to finish
    Then I should be on the results page

関連するステップ:

Then(/^I should be on the results page$/) do
  # fails under ``rake`` passes when run in isolation
  current_path.should == results_survey_path(1)
end

Then(/^I should be on the results page$/) do
  # passes in isolation and under ``rake``
  current_path.should == results_survey_path(Survey.last.id)
end

を使用する以外Capybara.javascript_driver = :webkitに、キュウリ/データベース クリーナーの設定は から変更されていませんrails g cucumber:install

失敗した rspec テストとキュウリ テストの両方が、同じ種類のインデックス作成の問題に苦しんでいるようです。上記で提案されたソリューションは機能しますが、非常にジャンキーであり、単純な絶対インデックスが機能しない理由について疑問を投げかけます (すべてのデータベースが各シナリオと機能の間でクリーンアップされた後)。私のテストに何か問題がありますか?database_cleaner とは?

もっとコードが役立つかどうか教えてください!

関連する gem バージョン:

  • アクティブモデル (3.2.14)
  • きゅうり(1.3.6)
  • きゅうりレール(1.3.1)
  • データベースクリーナー (1.0.1)
  • カピバラ (2.1.0)
  • カピバラウェブキット (1.0.0)
  • mysql2 (0.3.13)
  • rspec (2.13.0)
4

1 に答える 1

1

問題は、シナリオのdatabase_cleanerコードが欠落していることにあるようです。Cucumber

あなたのシナリオのdatabase_cleanerコードがあると言いましたが、のenv.rbには次のようなものが欠けているようです:RSpecCucumber

begin
  require 'database_cleaner'
  require 'database_cleaner/cucumber'

  DatabaseCleaner.strategy = :truncation
rescue NameError
  raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end

Around do |scenario, block|
  DatabaseCleaner.cleaning(&block)
end

このコードはありますか?

于 2014-12-10T14:53:50.193 に答える