Средство очистки базы данных не очищает сценарий с одним огурцом

Итак, моя команда вытесняет наше приложение rails (опрос и облегченную систему электронной записи), используя Cucumber, Rspec и все драгоценные камни, необходимые для использования этих сред тестирования. Я нахожусь в процессе настройки сервера Jenkins CI и хотел стандартизировать наши базы данных в наших средах тестирования, разработки и подготовки (в итоге мы выбрали MySQL).

При переключении среды тестирования с SQlite на MySQL мы обнаружили пару ошибок тестирования, связанных с кэшированием, которые мы устранили, используя относительные идентификаторы вместо жестко закодированных. пример:

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

После исправления этой единственной несостоявшейся спецификации я решил несколько не связанных с ней проблем с ajax, которые всегда мешали нашему набору тестов. Думая, что наконец-то овладел искусством тестирования, я уверенно запустил rake. Меня встретил такой недружелюбный взгляд:

снимок экрана 20 августа 2013 г. в 20: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?

Пожалуйста, дайте мне знать, если больше кода будет полезно!

Релевантные версии драгоценных камней:

  • активная модель (3.2.14)
  • огурец (1.3.6)
  • огурцы-рельсы (1.3.1)
  • база данных_очиститель (1.0.1)
  • капибара (2.1.0)
  • капибара-вебкит (1.0.0)
  • mysql2 (0.3.13)
  • рспек (2.13.0)

person dleve123    schedule 21.08.2013    source источник
comment
Мы только что столкнулись с подобной проблемой сразу после обновления капибары с версии 1.1.2 до 2.1.0. Приора, все зеленые тесты. После этого тестовая база данных становится все более загрязненной по мере повторного запуска сценариев.   -  person xxjjnn    schedule 12.09.2013
comment
Есть новости по этому поводу? Я вижу похожую проблему (сценарий Cucumber проходит изолированно, терпит неудачу со всем набором), и я пытаюсь поставить на него винты.   -  person pjmorse    schedule 22.10.2014
comment
@pjmorse @ClothSword Пробовали ли вы обновить версию database_cleaner до 1.3.0?   -  person etagwerker    schedule 10.12.2014
comment
@etagwerker Думаю, это версия, которую я использовал. (Возможно, я обновил его позже, чем тогда, когда я спросил об этом.)   -  person pjmorse    schedule 10.12.2014


Ответы (1)


Похоже, проблема в том, что вам не хватает database_cleaner кода для ваших Cucumber сценариев.

Вы упомянули, что у вас есть код database_cleaner для ваших сценариев RSpec, но кажется, что вам не хватает чего-то подобного для env.rb Cucumber:

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

У вас там есть этот код?

person etagwerker    schedule 10.12.2014
comment
Эта проблема давно решена, но эта конкретизированная конфигурация огурца, похоже, находится на правильном пути. Прямо сейчас мой (рабочий) конфиг огурца просто ``` begin DatabaseCleaner.strategy = :transaction Rescue NameError raise Вам нужно добавить database_cleaner в ваш Gemfile (в группе :test), если вы хотите его использовать. end Cucumber::Rails::Database.javascript_strategy = :truncation ``` @pjmorse вам поможет? Если да, то я приму ответ. - person dleve123; 10.12.2014