2013-08-21 1 views
1

Donc, mon équipe est en train de sortir notre application de rails (un système d'enregistrement et d'enregistrement électronique) en utilisant Cucumber, Rspec et toutes les gemmes nécessaires pour utiliser ces frameworks de test. Je suis en train de mettre en place un serveur CI Jenkins et je voulais normaliser nos bases de données à travers nos environnements de test, de développement et de mise en scène (nous avons fini par choisir MySQL). Lors du passage de l'environnement de test de SQlite à MySQL, nous avons découvert quelques bogues de test liés à la mise en cache que nous avons résolus en utilisant des identifiants relatifs au lieu de ceux codés en dur. exemple:Un nettoyeur de base de données ne nettoie pas un seul scénario de concombre

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 

Après avoir résolu celui-ci ne spec, j'ai adressé quelques questions sans rapport avec ajax qui ont affligent toujours notre suite de tests. Pensant que j'ai finalement mastédé l'art de tester, j'ai couru avec confiance rake. Je suis rencontré ce spectacle hostile:

screen shot 2013-08-20 at 8 12 42 pm

Maintenant, bien sûr cucumber features/presenting_default_questions.feature pluies vert lorsqu'il est lancé dans l'isolement.

défaut Scénario:

@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 

étape pertinente:

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 

En plus de l'utilisation de Capybara.javascript_driver = :webkit, la configuration du filtre concombre/base de données est non modifiée à partir de rails g cucumber:install.

Il semble que les tests rspec et concombre défaillants souffrent du même type de problème d'indexation. Alors que la solution proposée ci-dessus fonctionne, c'est super janky et pose la question de savoir pourquoi un simple index absolu ne fonctionne pas (après tout, la base de données est nettoyée entre chaque scénario et fonctionnalité). Y at-il quelque chose avec mes tests? Avec database_cleaner?

S'il vous plaît laissez-moi savoir si plus de code serait utile!

versions de pierres précieuses relavent:

  • ActiveModel (3.2.14)
  • concombre (1.3.6)
  • rails de concombre (1.3.1)
  • database_cleaner (1.0.1)
  • capybara (2.1.0)
  • capybara-webkit (1.0.0)
  • mysql2 (0.3.13)
  • rspec (2.13.0)
+0

Nous venons de rencontrer un problème similaire immédiatement après la mise à jour de capybara de la version 1.1.2 vers la version 2.1.0. Avant, tous les tests verts. Après, la base de données de test devient de plus en plus polluée pendant que nous réexécutons les scénarios – xxjjnn

+0

Des mises à jour à ce sujet? Je vois un problème similaire (le scénario du concombre passe isolément, échoue avec toute la suite) et j'essaye de lui mettre les vis. – pjmorse

+0

@pjmorse @ClothSword Avez-vous essayé de mettre à jour la version de 'database_cleaner' vers' 1.3.0'? – etagwerker

Répondre

1

Le problème semble être que vous manquez le code database_cleaner pour vos Cucumber scénarios.

Vous avez dit que vous avez le code database_cleaner pour vos RSpec scénarios, mais il semble que vous manquez quelque chose comme ça pour env.rb de 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 

Avez-vous ce code là-dedans ?

+1

Ce problème s'est résolu il y a longtemps, mais cette confection de concombre étoffée semble être sur la bonne voie. En ce moment, mon (travail) config de concombre est juste '' ' commencer DatabaseCleaner.strategy =: transaction NameError de sauvetage augmentation « Vous devez ajouter database_cleaner à votre Gemfile (dans le: groupe test) si vous souhaitez utiliser il." fin concombre :: Rails :: Database.javascript_strategy =: troncature '' ' @pjmorse-ce que cela vous aider? Si oui, j'accepterai la réponse. – dleve123

Questions connexes