2012-07-27 28 views
23

Soy nuevo en el uso de RSpec para escribir pruebas en una aplicación de Rails que utiliza una base de datos MySQL. He definido mis accesorios y estoy a cargar en mi especificación de la siguiente manera:Accesorios en RSpec

before(:all) do 
    fixtures :student 
end 

¿Esta declaración guardar los datos definidos en mis accesorios en la mesa estudiantes o solo cargar los datos en la tabla, mientras que las pruebas son correr y eliminarlo de la mesa después de ejecutar todas las pruebas?

+10

En lugar de artefactos, pruebe [factory_girl] (http://www.fabricationgem.org/) o [fabrication] (http://www.fabricationgem.org/). –

Respuesta

-1

Depende de la forma en que configure RSpec. Ver here para más detalles

1

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) para destruir o usar 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.

16

Si desea utilizar accesorios con RSpec, especificar sus accesorios en el bloque de describir, no dentro de una antes del bloque:

describe StudentsController do 
    fixtures :students 

    before do 
    # more test setup 
    end 
end 

sus accesorios estudiante obtendrá cargado en la tabla de los estudiantes y luego se deshace en el fin de cada prueba usando transacciones de base de datos.

+1

https://www.relishapp.com/rspec/rspec-rails/docs/model-specs/transactional-examples#run-in-transactions-with-fixture – nruth

3

En primer lugar: No se puede utilizar el método fixtures en :all/:context/:suite hook. No intente utilizar accesorios en estos enganches (como post(:my_post)).

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

llamada

fixtures :students, :teachers 

no se cargan los datos en base de datos! Solo prepara los métodos de ayuda students y teachers. Los registros reclamados se cargan de forma diferida en el momento en que intenta acceder por primera vez. Justo antes de

dan=students(:dan) 

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

Así que si preparas a algunos estudiantes en el enlace antes (: contexto), ya se habrán ido.

La inserción de registros se realiza 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 anteriormente pasarán

Si estas pruebas se realizan nuevamente (en la próxima suite) y en este orden, que la expectativa

expect(Student.count).to eq 1 

NO se cumplirá! Habrá 3 estudiantes (: dan,: paul y nuevos @james). Todos ellos se eliminarán antes de students(:dan) y solo: paul y: dan se insertarán de nuevo.

+1

¡Sí! Encontré el truco para hacer que todas las luminarias se carguen antes de todas las pruebas. Solo agregue RSpec.configure {| config | config.global_fixtures =: all} Y prueba en spec_helper directamente, que intentará acceder a cualquier dispositivo. De esta forma, todos los dispositivos se cargan por adelantado. – Foton