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.