tests test run rails matchers how ruby-on-rails ruby rspec rspec2 rspec-rails

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

https://github.com/rails/rails/pull/19282