tutorial test rails assigns ruby-on-rails testing rspec bdd

ruby on rails - test - Verificación de asociaciones ActiveRecord en RSpec



rspec tutorial rails 5 (4)

Debido a que las asociaciones de ActiveRecord deben ser bien probadas por el conjunto de pruebas de Rails (y lo son), la mayoría de las personas no sienten la necesidad de asegurarse de que funcionan, simplemente se supone que lo harán.

Si quieres asegurarte de que tu modelo esté usando esas asociaciones, eso es algo diferente, y no te equivocas al querer probar eso. Me gusta hacer esto usando la gema de shoulda . Te permite hacer cosas limpias como esta:

describe Post do it { should have_many(:comments).dependent(:destroy) } end

Estoy aprendiendo a escribir casos de prueba utilizando Rspec. Tengo un simple andamio de comentarios donde un post puede tener muchos comentarios. Estoy probando esto utilizando Rspec. ¿Cómo debo hacer para verificar la Post :has_many :comments . ¿Debo Post.comments método de Post.comments y luego verificar esto devolviendo un objeto simulado de una matriz de objetos de comentarios? ¿Son realmente necesarias las pruebas para las asociaciones de AR?


En general, probar asociaciones es una buena práctica, especialmente en un entorno en el que TDD goza de gran prestigio: otros desarrolladores a menudo consultarán sus especificaciones antes de consultar el código correspondiente. Las asociaciones de prueba se aseguran de que su archivo de especificaciones refleje con mayor precisión su código.

Dos formas de probar asociaciones:

  1. Con FactoryGirl:

    expect { FactoryGirl.create(:post).comments }.to_not raise_error

    Esta es una prueba relativamente superficial que, con una fábrica como:

    factory :post do title { "Top 10 Reasons why Antelope are Nosy Creatures" } end

    devolverle un NoMethodError si su modelo carece de una asociación has_many con comentarios.

  2. Puede usar el método #reflect_on_association ActiveRecord para #reflect_on_association con más detalle su asociación. Por ejemplo, con una asociación más compleja:

    class Post has_many :comments, through: :user_comments, source: :commentary end

    Puedes echar un vistazo más profundo a tu asociación:

    reflection = Post.reflect_on_association(:comment) reflection.macro.should eq :has_many reflection.options[:through].should eq :user_comments reflection.options[:source].should eq :commentary

    y prueba sobre cualquier opción o condición que sea relevante.


La mayoría de la gente no prueba las asociaciones, ya que Rails ya tiene pruebas unitarias para asegurarse de que esos métodos funcionen correctamente. Si está haciendo algo complejo, como involucrar un proceso o algo, es posible que desee probarlo explícitamente. Usualmente puedes hacer esto simplemente haciendo

a = Post.new a.comments << Comment.new assert a.save assert a.comments.size == 1

o algo parecido a eso.


Si prefiere no usar una gema externa como shoulda para probar sus asociaciones (consulte la Answer para obtener detalles sobre eso), otra opción es usar #reflect_on_association para obtener el objeto AssociationReflection para la asociación relevante, y luego afirmar sobre eso :

describe Post do it "should destroy its comments when it is destroyed" do association = Post.reflect_on_association(:comments) expect(association).to_not be_nil expect(association.options[:dependent]).to eq :destroy end end