web-dev-qa-db-fra.com

Calendrier dans RSpec

Je suis nouveau dans l'utilisation de RSpec pour écrire des tests dans une application Rails qui utilise une base de données MySQL. J'ai défini mes appareils et je les charge dans mes spécifications comme suit:

before(:all) do
  fixtures :student
end

Cette déclaration enregistre-t-elle les données définies dans mes appareils dans la table des étudiants ou charge-t-elle simplement les données dans la table pendant que les tests sont en cours et les supprime-t-elle de la table une fois tous les tests exécutés?

32
Kris

Si vous souhaitez utiliser des appareils avec RSpec, spécifiez vos appareils dans le bloc décrire, pas dans un bloc avant:

describe StudentsController do
  fixtures :students

  before do
    # more test setup
  end
end

Vos appareils étudiants seront chargés dans la table des étudiants, puis restaurés à la fin de chaque test à l'aide des transactions de la base de données.

22
infused

Tout d'abord: vous ne pouvez pas utiliser la méthode fixtures dans :all/:context/:suite hook. N'essayez pas d'utiliser des luminaires dans ces crochets (comme post(:my_post)).

Vous ne pouvez préparer des appareils que dans le bloc décrire/contexte comme l'écrit Infuse plus tôt.

Appel

fixtures :students, :teachers

ne chargez aucune donnée dans DB! Prépare simplement les méthodes d'assistance students et teachers. Les enregistrements demandés sont chargés paresseusement au moment où vous essayez d'y accéder pour la première fois. Juste avant

dan=students(:dan) 

Cela chargera les étudiants et les enseignants de la manière delete all from table + insert fixtures.

Donc, si vous préparez des étudiants avant le crochet (: context), ils seront partis maintenant !!

L'insertion des enregistrements se fait une seule fois dans la suite de tests.

Les enregistrements des appareils ne sont pas supprimés à la fin de la suite de tests. Ils sont supprimés et réinsérés lors de la prochaine exécution de la suite de tests.

exemple:

 #students.yml
   dan:
     name: Dan 
   paul:
     name: Paul

 #teachers.yml
    snape:
      name: Severus




describe Student do
  fixtures :students, :teachers

  before(:context) do
    @james=Student.create!(name: "James")
  end

  it "have name" do
   expect(Student.find(@james.id).to be_present
   expect(Student.count).to eq 1
   expect(Teacher.count).to eq 0

   students(:dan)

   expect(Student.find_by_name(@james.name).to be_blank
   expect(Student.count).to eq 2
   expect(Teacher.count).to eq 1

  end
end


#but when fixtures are in DB (after first call), all works as expected (by me)

describe Teacher do
  fixtures :teachers #was loade in previous tests

  before(:context) do
    @james=Student.create!(name: "James")
    @thomas=Teacher.create!(name: "Thomas")
  end

  it "have name" do
   expect(Teacher.find(@thomas.id).to be_present
   expect(Student.count).to eq 3 # :dan, :paul, @james
   expect(Teacher.count).to eq 2 # :snape, @thomas

   students(:dan)

   expect(Teacher.find_by_name(@thomas.name).to be_present
   expect(Student.count).to eq 3
   expect(Teacher.count).to eq 2

  end
end

Toutes les attentes des tests ci-dessus passeront

Si ces tests sont exécutés à nouveau (dans la suite suivante) et dans cet ordre, alors l'attente

 expect(Student.count).to eq 1

ne sera PAS rencontré! Il y aura 3 étudiants (: dan,: paul et new @james). Tous seront supprimés avant students(:dan) et seulement: paul et: dan seront à nouveau insérés.

5
Foton

before(:all) conserve les données exactes, car elles sont chargées/créées une fois. Vous faites votre truc, et à la fin du test ça reste. C'est pourquoi le lien de bui a after(:all) pour détruire ou utiliser before(:each); @var.reload!;end pour obtenir les dernières données des tests précédents. Je peux voir en utilisant cette approche dans rspec imbriqué décrire des blocs.

1
pjammer