ruby-on-rails - test - rspec rails 5
RSpec: nivelar la tabla/destruir objetos después de cada contexto (3)
¿Intentó agregar un método anterior?
describe MyController do
before(:each) do
User.delete_all
MyOtherModel.delete_all
...
end
¿Cómo se eliminan los objetos (en la base de datos y en la memoria) que creó
- después de cada prueba
- Y después de cada contexto? (en un contexto, podría tener sentido construir pruebas el uno al otro)
¿Hay un método para hacer esto automáticamente?
Tengo el siguiente problema:
Cada prueba guarda las entradas en la base de datos. La siguiente prueba depende de estas entradas. Incluso si quisiera construir pruebas que dependen de otras pruebas, no podría, porque el orden en que se ejecutan las pruebas no es controlable.
factories.rb:
sequence(:name) { |n| "purchaser #{n}" }
organization_spec.rb:
context "when no supplier exists" do
it "finds no associated suppliers" do
purchaser = create(:organization_purchaser)
purchaser.partners.empty?.should == true
end
end
context "when one supplier exists" do
it "finds one associated suppliers" do
purchaser = create(:organization_purchaser)
supplier = create(:organization_supplier)
partnership = create(:partnership, organization: purchaser, partner: supplier)
purchaser.partners.last.name.should == "purchaser 1"
end
end
context "when two suppliers exist" do
it "finds two associated suppliers" do
purchaser = create(:organization_purchaser)
2.times do |i|
supplier = create(:organization_supplier)
partnership = create(:partnership, organization: purchaser, partner: supplier)
end
purchaser.partners.last.name.should == "purchaser 2"
end
end
Salida de RSpec:
Organization
#suppliers_for_purchaser
responds
when no supplier exists
finds no associated suppliers
when two suppliers exist
finds two associated suppliers
when one supplier exists
finds one associated suppliers (FAILED - 1)
Failures:
1) Organization#suppliers_for_purchaser when one supplier exists finds one associated suppliers
Failure/Error: purchaser.partners.last.name.should == "purchaser 1"
expected: "purchaser 1"
got: "purchaser 3" (using ==)
Creo que su pregunta es más sobre la línea de cómo puedo restablecer una secuencia de niña de fábrica? Los que no están almacenados en la base de datos, incluso si elimina todo, seguirá teniendo el problema. Cuando pruebo algo como esto, me resulta más fácil anular la secuencia de las chicas de fábrica.
it "finds one associated suppliers" do
purchaser = create(:organization_purchaser)
supplier = create(:organization_supplier , name: "My First Supplier")
partnership = create(:partnership, organization: purchaser, partner: supplier)
purchaser.partners.last.name.should == "My First Supplier"
end
Las otras cosas que probablemente hagas es algo así como
it "finds one associated suppliers" do
purchaser = create(:organization_purchaser)
supplier = create(:organization_supplier)
partnership = create(:partnership, organization: purchaser, partner: supplier)
purchaser.partners.last.should == supplier
end
o incluso
it "finds one associated suppliers" do
purchaser = create(:organization_purchaser)
supplier = create(:organization_supplier)
partnership = create(:partnership, organization: purchaser, partner: supplier)
purchaser.partners.last.name.should == supplier.name
end
Deberías usar Database Cleaner
Todo lo que tiene que hacer es agregar el siguiente código a su archivo de configuración de spec_helper.rb
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
ACTUALIZAR
A partir de Rails 5.1 esto no es necesario si usa config.use_transactional_tests