10
votes

Les tests de l'unité Rails ne chargent pas les appareils

Test de râteau: unités échoue dans mon application actuelle, car les données nécessaires des appareils sont manquantes.

Si je charge les appareils manuellement via Rake DB: Fixtures: chargez des rails_env = Test Les tests d'unité fonctionnent, mais le râteau purge la base de données de test.

My Test_Helper inclut Fixtures: Tous et mes tests en héritage - mais les appareils ne se chargent tout simplement pas.

Je suis un peu désemparé pour le moment et pourrait avoir besoin d'une aide!

J'ai beaucoup essayé et je pense que cela a à voir avec des paramètres d'environnement ou des plugins utilisés dans ce projet. Est-ce que quelqu'un sait où lire sur quels fichiers sont chargés pour l'environnement de test?


1 commentaires

Pour ce que cela vaut, j'ai rencontré un problème similaire, sauf que je définissais une constante qui s'appuyait sur un enregistrement de base de données. Déplacé cela constant à une variable d'instance et de booya. On dirait que les constantes sont définies avant que les appareils soient chargés également. À votre santé.


6 Réponses :


0
votes

Je ne sais pas si vous l'avez déjà fait, mais exportez les données de test de la base de données vers les fichiers YML dans des tests / luminaires à l'aide d'un plugin comme AR_FIXTURES


1 commentaires

HMM, le problème est d'obtenir des données des appareils dans la base de données, je pense que ar_fixtures fait l'inverse! :)



6
votes

Mettez l'appel à Fixtures: Tous dans votre classe de test, pas la classe Super (Test_Helper). Je suppose que l'initialisation de la super classe ne fonctionne pas la manière dont vous m'attendez et que fixtures: tout n'est pas appelé. Essayez peut-être de mettre l'appel dans la méthode d'initialisation de test_helper.

mon test / test_helper.rb ressemble à ceci: xxx


2 commentaires

Bonjour Csummp, j'ai essayé de mettre luminaires: tout directement dans ma classe de test, mais cela n'a pas fonctionné. On dirait que l'appel n'a pas d'effet - mais je ne peux tout simplement pas imaginer pourquoi!


+1: Cela a fonctionné pour moi et j'aime cette solution car il est localisé et explicite. Dans ce cas, Fixtures: utilisateurs dans usercontroltertest suffira.



4
votes

J'ai enfin trouvé le problème, bien que les solutions soient une sorte de hacky.

Un plugin s'appuie sur le fait qu'il existe des données dans la base de données, au moins une ligne. Alors qu'est-ce qui s'est passé était:

  1. Rake Chars Base de base de données Schema
  2. RAKE tente de charger environnement
  3. Environnement comprend plug-in
  4. Le chargement du plugin échoue en raison de manquer au moins une ligne
  5. aucun appareil n'est chargé

    La solution hacky est la suivante: mettre les données nécessaires directement dans le schéma et non dans des appareils, car il est chargé de fin.

    Je vais chercher une solution plus pratique et mettra à jour cette réponse si j'en ai trouvé un.


2 commentaires

Les plugins ne devraient pas faire de choses comme ça. La meilleure chose à faire est de corriger le plugin et de leur envoyer une demande de traction sur GitHub.


J'ai corrigé la question dans le plugin et soumettra un correctif bientôt. ;)



5
votes

Une autre approche consiste à écrire votre propre tâche de râteau personnalisée pour les tests.

Par exemple: P>


task :test_units do

  RAILS_ENV = 'test' # Force the environment to test

  puts "Recreate the test database"
  Rake::Task['db:test:prepare'].invoke

  puts "Seed the database with fixtures"
  Rake::Task['db:fixtures:load'].invoke

  puts "Executing Unit Tests"
  Rake::Task['test:units'].prerequisites.clear 
  Rake::Task['test:units'].invoke
end


1 commentaires

Cela a fonctionné pour moi, +1. La seule différence était que je devais mettre rails_env = 'test' après dB: test: préparer oue sinon SQLite3 échoue avec une erreur disant que je n'ai pas le bon Autorisations pour purger le test DB.



0
votes

J'ai eu le même problème. Ou plutôt, le problème était que mes appareils n'étaient pas à jour avec le schéma de la base de données. Au lieu de jeter une exception, les rails utilisent simplement la base de données de test comme solution de secours. La plupart des IFFY.


0 commentaires

1
votes

Mon problème est oublié de mettre "besoin" test_helper "" à la tête. par exemple.

require 'test_helper'

class AdminUserTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
end


0 commentaires