Pregunta

He pegado las especificaciones que he escrito para las publicaciones / show.html.erb en una aplicación que estoy escribiendo como un medio para aprender RSpec. Todavía estoy aprendiendo sobre simulacros y tropezones. Esta pregunta es específica para el " debe enumerar todos los comentarios relacionados " especulación.

Lo que quiero es probar que la vista del programa muestra los comentarios de una publicación. Pero de lo que no estoy seguro es de cómo configurar esta prueba y luego hacer que la prueba repita debe contener declaraciones ('xyz'). ¿Alguna pista? ¡Otras sugerencias también son apreciadas! Gracias.

--- Editar

Alguna información más. Tengo un named_scope aplicado a los comentarios en mi opinión (lo sé, lo hice un poco al revés en este caso), por lo que @ post.comments.approved_is (verdadero). El código pegado responde con el error '' método indefinido 'aprobado_es' para # '', lo cual tiene sentido ya que le dije que no recibiera comentarios y devolviera un comentario. Sin embargo, todavía no estoy seguro de cómo encadenar los talones para que @ post.comments.approved_is (true) devuelva una serie de comentarios.

¿Fue útil?

Solución

Stubbing realmente es el camino a seguir aquí.

En mi opinión, todos los objetos en el controlador y las especificaciones de vista deben estar tropezados con objetos simulados. No hay una necesidad real de pasar tiempo probando de forma redundante la lógica que ya debería probarse exhaustivamente en las especificaciones de su modelo.

Aquí hay un ejemplo de cómo configuraría las especificaciones en su Pastie & # 8230;

describe "posts/show.html.erb" do

  before(:each) do
    assigns[:post] = mock_post
    assigns[:comment] = mock_comment
    mock_post.stub!(:comments).and_return([mock_comment])
  end

  it "should display the title of the requested post" do
    render "posts/show.html.erb"
    response.should contain("This is my title")
  end

  # ...

protected

  def mock_post
    @mock_post ||= mock_model(Post, {
      :title => "This is my title",
      :body => "This is my body",
      :comments => [mock_comment]
      # etc...
    })
  end

  def mock_comment
    @mock_comment ||= mock_model(Comment)
  end

  def mock_new_comment
    @mock_new_comment ||= mock_model(Comment, :null_object => true).as_new_record
  end

end

Otros consejos

No estoy seguro de si esta es la mejor solución, pero pude hacer que la especificación pasara al apuntar solo el named_scope. Agradecería cualquier comentario sobre esto, así como sugerencias para una mejor solución, dado que hay una.

  it "should list all related comments" do
@post.stub!(:approved_is).and_return([Factory(:comment, {:body => 'Comment #1', :post_id => @post.id}), 
                                      Factory(:comment, {:body => 'Comment #2', :post_id => @post.id})])
render "posts/show.html.erb"
response.should contain("Joe User says")
response.should contain("Comment #1")
response.should contain("Comment #2")

fin

Se lee un poco desagradable.

Podrías hacer algo como:

it "shows only approved comments" do
  comments << (1..3).map { Factory.create(:comment, :approved => true) }
  pending_comment = Factory.create(:comment, :approved => false)
  comments << pending_comments
  @post.approved.should_not include(pending_comment)
  @post.approved.length.should == 3
end

O algo por el estilo. Especifique el comportamiento, algún método aprobado debería devolver los comentarios aprobados para una publicación. Eso podría ser un método simple o un named_scope. Y pendiente también haría algo obvio.

También podría tener una fábrica para: pendientes_comentarios, algo así como:

Factory.define :pending_comment, :parent => :comment do |p|
  p.approved = false
end

O, si falso es el valor predeterminado, puede hacer lo mismo para: shared_comments.

Me gusta mucho el enfoque de Nick. Yo mismo tuve el mismo problema y pude hacer lo siguiente. Creo que mock_model también funcionaría.

post = stub_model(Post)
assigns[:post] = post
post.stub!(:comments).and_return([stub_model(Comment)])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top