2010-04-20 15 views
17

Estoy aprendiendo a escribir casos de prueba usando Rspec. Tengo un andamio de comentarios simple donde una publicación puede tener muchos comentarios. Estoy probando esto usando Rspec. ¿Cómo debo verificar el Post :has_many :comments? ¿Debería insertar el método Post.comments y luego verificar esto devolviendo un objeto simulado de una matriz de objetos de comentarios? ¿Es realmente necesario realizar pruebas para asociaciones de AR?Verificación de asociaciones ActiveRecord en RSpec

Respuesta

28

Como 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 funcionen; se supone que lo harán.

Si quiere asegurarse de que su modelo es usando esas asociaciones, eso es algo diferente, y no está equivocado por querer probar eso. Me gusta hacer esto usando la gema shoulda. Te permite hacer cosas interesantes como esta:

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

Gracias! tiene una vista bastante clara ahora. –

+0

Woops, comprueben eso. Quise decir la gema Shoulda, no factory_girl. –

0

La mayoría de las personas no prueba las asociaciones, ya que Rails ya cuenta con pruebas unitarias para asegurarse de que esos métodos funcionen correctamente. Si está haciendo algo complejo, como involucrar un proceso o algo así, es posible que desee probarlo explícitamente. Por lo general, puede hacer esto simplemente haciendo

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

o algo así.

+0

Te tengo parcialmente. Soy nuevo en las pruebas.Digamos que escribo una prueba unitaria para verificar que todos los comentarios se eliminen cuando se elimina la publicación relacionada. Entonces esto es suficiente? Además, incluso necesito escribir una prueba unitaria para verificar un método de destrucción generado por andamios. –

12

asociaciones de prueba es una buena práctica en general, especialmente en un entorno donde TDD es altamente regarded- otros desarrolladores suelen mirar a sus especificaciones antes de mirar el código correspondiente. Las asociaciones de prueba se aseguran de que su archivo de especificación refleje con mayor precisión su código.

Dos maneras en que puede probar asociaciones:

  1. Con factorygirl:

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

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

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

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

  2. Puede utilizar el método ActiveRecord #reflect_on_association para examinar su asociación con mayor profundidad. Por ejemplo, con una asociación más complejo:

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

    Puede echar un vistazo más profundo en su 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 probar en cualquiera de las opciones o condiciones son relevantes.

1

Si no utilizas una joya externo como shoulda a prueba sus asociaciones (ver Robert Speicher 's Answer para más detalles sobre esto), otra opción es utilizar reflect_on_association para obtener el objeto AssociationReflection de la asociación correspondiente , y luego afirmar en 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 
Cuestiones relacionadas