test rails before ruby-on-rails rspec bdd fixtures

ruby-on-rails - before - rspec rails 5



Accesorios en RSpec (4)

Soy nuevo en el uso de RSpec para escribir pruebas en una aplicación Rails que utiliza una base de datos MySQL. Definí mis accesorios y los estoy cargando en mi especificación de la siguiente manera:

before(:all) do fixtures :student end

¿Esta declaración guarda los datos definidos en mis aparatos en la tabla de estudiantes o simplemente carga los datos en la tabla mientras se están ejecutando las pruebas y los elimina de la tabla después de que se ejecutan todas las pruebas?


Depende de la forma en que configure RSpec. Mira aquí para más detalles


before(:all) mantiene los datos exactos, ya que se cargan / crean una vez. Usted hace lo suyo, y al final de la prueba se queda. Es por eso que el enlace de Bui tiene after(:all) destruir o usar before(:each); @var.reload!;end before(:each); @var.reload!;end para obtener los datos más recientes de las pruebas anteriores. Puedo ver el uso de este enfoque en bloques de descripción rspec anidados.


Si desea utilizar dispositivos con RSpec, especifique sus dispositivos en el bloque de descripción, no dentro de un bloque anterior:

describe StudentsController do fixtures :students before do # more test setup end end

Los accesorios de tus alumnos se cargarán en la tabla de alumnos y luego se revertirán al final de cada prueba utilizando las transacciones de la base de datos.


En primer lugar: no puede usar fixtures método en :all / :context / :suite hook . No intente utilizar dispositivos en estos post(:my_post) (como post(:my_post) ).

Puede preparar accesorios solo en describir / bloque de contexto como Infuse write before.

Llamada

fixtures :students, :teachers

¡no cargue datos en DB! Solo prepara métodos de ayuda a students y teachers . Los registros exigidos se cargan de forma perezosa en el momento en que intenta acceder a ellos por primera vez. Justo antes de

dan=students(:dan)

Esto cargará a los estudiantes y profesores en delete all from table + insert fixtures .

Entonces, si preparas a algunos estudiantes en el enlace anterior (: contexto), ya se habrán ido.

La inserción de registros se hace solo una vez en el banco de pruebas.

Los registros de los dispositivos no se eliminan al final del conjunto de pruebas. Se eliminan y se vuelven a insertar en el próximo banco de pruebas.

ejemplo:

#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

Todas las expectativas en las pruebas anteriores pasarán

Si estas pruebas se ejecutan de nuevo (en el siguiente paquete) y en este orden, de lo esperado

expect(Student.count).to eq 1

NO se cumplirá! Habrá 3 estudiantes (: dan,: paul y nuevos @james). Todos ellos serán eliminados antes de que los students(:dan) y solo: paul y: dan sean insertados nuevamente.