2017-06-20 10 views
1

Donc im imitant SQLite et essayant d'utiliser des fixtures pour charger dans les données correctes à afficher et tester via le navigateur avec capybara.SQLite3: Exception occupée avec Capybara/Poltergeist

Ma suite de tests utilise un Minitest avec Capybara et Poltergeist pour le pilote. la partie pertinente de mon dossier test_helper.rb ressemble à ceci:

require "minitest/reporters" 
reporters = [] 
reporters << Minitest::Reporters::SpecReporter.new 
Minitest::Reporters.use! reporters, ENV, Minitest.backtrace_filter 

require "minitest/rails/capybara" 
Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new(app, :js_errors => false) 
end 
Capybara.default_driver = :poltergeist 
Capybara.current_driver = :poltergeist 
Capybara.javascript_driver = :poltergeist 

Toutefois, j'ai un test simple qui cogne un login niveau d'accès utilisateur pour l'application Web présente est en cours d'exécution sur, puis visite simplement la route.

Cependant, il échoue à ce qui semble être la méthode "User Access Stubbing" qui im. Qui ressemble à Core::User.any_instance.stubs(etc...) qui vient de renvoyer un modèle d'utilisateur.

Quoi qu'il en soit l'erreur exacte que je reçois est:

ActiveRecord::StatementInvalid:   ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: commit transaction 

Depuis im en utilisant des appareils serait-ce peut-être un problème de nettoyage de DB (Im ne pas l'utiliser en ce moment comme im utilisant uniquement les appareils pré-créés actuellement) Je Je n'ai jamais utilisé de nettoyant DB avec minitest car je suis seulement familier avec l'utilisation de rspec et factory girl.

Répondre

1

L'erreur vous indique qu'une autre connexion à la base de données a déjà ouvert sqlite pour l'écriture (elle peut gérer plusieurs lecteurs mais un seul écrivain à la fois). Vous ne montrez pas votre test réel ou votre talon, il est impossible de dire précisément où se trouve votre problème, mais vous avez fait une demande, puis vous exécutez un autre accès à la base de données (par exemple, avez-vous préchargé l'objet? le talon revient, ou est-il chargé quand le talon est exécuté?).

Si votre application n'utilise pas sqlite en tant que base de données, passez à l'étape de test sur la base de données que l'application utilisera en production. De plus, le stubbing est un anti-pattern dans les tests de fonctionnalités, vous devriez simplement créer des enregistrements appropriés et les traiter.

+0

Je souhaite que je puisse poster le code, mais puisque c'est le code de travail ... Je ne peux pas vraiment. La chose est bien que le test est littéralement en train d'ouvrir une page et de charger un utilisateur, ce qu'un autre test réussit. Cependant l'autre test vient d'utiliser minitest et l'User-Agent, 'Ruby' page.driver avec capybara. Alors que j'utilise poltergeist avec capybara. – msmith1114

+0

@ msmith1114 Je ne comprends pas ce que vous entendez par "page.driver avec capybara", si vous voulez dire qu'il utilise le pilote racktest, c'est une énorme différence car tout tourne dans un seul thread synchrone - d'où une seule connexion DB. Lors de l'utilisation de poltergeist il y a au moins 2 threads (tests, app) et potentiellement plus, peut avoir plusieurs demandes lorsque la page se charge et plusieurs connexions DB. Si votre application n'utilise pas réellement sqlite dans l'échange de production pour tester avec ce que vous utilisez en production, vous aurez beaucoup plus de facilité. –

+0

Problème est notre production DB est une version très ancienne de SQL-Server avec laquelle DB Cleaner ne fonctionnera pas, donc revenir à une table rase à chaque fois est fondamentalement impossible. Y at-il un moyen de contourner ce problème de sqlite? ou peut-être que je dois juste rester avec des tests non basés sur le navigateur pour l'instant. et le pilote qu'il dit qu'il utilise (quelqu'un d'autre a écrit ce rappel) est défini comme: 'page.driver.header ('User-Agent', 'Ruby')' ce qui suppose qu'il utilise le pilote de rack – msmith1114