Forum: Rails-ES TestCase: assert_render_partial

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2009-01-24 02:21
(Received via mailing list)
Hola gente,

No encuentro nada por ahí para poder hacer un assert en un test para
comprobar que se está renderizando un partial en concreto.

Por ejemplo:

   assert_render_partial 'paper/comments'


Lo más cercano que he encontrado es:

    assert_template 'papers/_comments.html.erb'


A ver quién es el primero que me linka a:

http://letmegooglethatforyou.com/

:P

f.
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-01-24 05:09
(Received via mailing list)
On Sat, Jan 24, 2009 at 2:21 AM, Fernando Guillen
<fguillen.mail@gmail.com>wrote:

> No encuentro nada por ahí para poder hacer un assert en un test para
> comprobar que se está renderizando un partial en concreto.
> Por ejemplo:
>
>   assert_render_partial 'paper/comments'


Primero supongo que se trata de un test de vista.
Segundo, yo tiraría por comprobar que el contenido del partial está en
la
vista. Esto me permite integrarlo todo en una vista (partials que con el
tiempo ya no tienen sentido como partials) o dejar la vista como un
compendio de partials (divide y vencerás) sin tener que modificar los
tests.

Y tercero:
ActionView::Base.any_instance.expects(:render).with(:partial =>
'my_partial')

o ahora que miro la documentación, parece que solo existe un render en
actioncontroller, de tal manera que quedaría algo así.
ActionController::Base.any_instance.expects(:render).with(:partial =>
'my_partial')

Esto es con mocha. Otras gemas de mocking pueden cambiar la sintaxis.

Así de repente no se me ocurre otra manera.

Por cierto. ¿Algún sistema para moquear que compruebe y ejecute la
llamada
al mismo método que se moquea?

Un Saludo.
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2009-01-26 17:34
(Received via mailing list)
Guillermo,

Perdona que no haya contestado antes.. no he podido hacer pruebas hasta
ahora.

El día 24 de enero de 2009 5:09, Guillermo <guillermo@cientifico.net>
escribió:>
> Primero supongo que se trata de un test de vista.

Nope, es un funcional, no sé que es un test de vista.

Es un test de un controlador y una de las cosas que quiero testear es
que el render final es este:
render :partial => 'papers/comment', :object => @comment

> Segundo, yo tiraría por comprobar que el contenido del partial está en la
> vista. Esto me permite integrarlo todo en una vista (partials que con el
> tiempo ya no tienen sentido como partials) o dejar la vista como un
> compendio de partials (divide y vencerás) sin tener que modificar los tests.

Es que en realidad no quiero comprobar que el partial se está
renderizando junto a otros partials sino que ese partial es lo único
que se está renderizando.

Por que el partial también está en el show del Paper.. y un positivo
ahí sería un error para mí pues no quiero que se renderize el show de
Paper sino ese partial y sólo eso.

> Y tercero:
> ActionView::Base.any_instance.expects(:render).with(:partial =>
> 'my_partial')
> o ahora que miro la documentación, parece que solo existe un render en
> actioncontroller, de tal manera que quedaría algo así.
> ActionController::Base.any_instance.expects(:render).with(:partial =>
> 'my_partial')

Buena aproximación pero no me funa del todo

Si pongo el mock al principio tal que
así:
  def test_on_create_with_format_js_should_render_partial
    ActionView::Base.any_instance.expects(:render).with(:partial =>
'papers/comment')
    login_as users(:user1)

    post(
      :create,
      :paper_id => papers(:paper2).id,
      :comment => { :text => 'text'},
      :format => 'js'
    )

    assert_response :success
    assert_template 'papers/_comment'
  end

Me peta porque la invocación al método render no es exactamente así
sino que se le pasa un :object => @comment

unexpected invocation: #<AnyInstance:ActionView::Base>.render(:partial
=> 'papers/comment', :object => #<Comment:0x36a8440>)
unsatisfied expectations:
- expected exactly once, never invoked:
#<AnyInstance:ActionView::Base>.render(:partial => 'papers/comment')

Si intento mockear con la llamada tal cual la recibe lo tengo que
hacer después de la llamada al post tal que
así:
  def test_on_create_with_format_js_should_render_partial
    login_as users(:user1)

    post(
      :create,
      :paper_id => papers(:paper2).id,
      :comment => { :text => 'text'},
      :format => 'js'
    )
    ActionView::Base.any_instance.expects(:render).with(:partial =>
'papers/comment', :object => assigns(:comment))

    assert_response :success
    assert_template 'papers/_comment'
  end

Me peta porque, me imagino, que el mock espera que se le haga la
invocación al método que mockea desdpués de la declaración y claro la
invocación se hace en el post y no depués.. me peta con este error:

expected exactly once, never invoked:
#<AnyInstance:ActionView::Base>.render(:partial => 'papers/comment',
:object => #<Comment:0x36b69a0>)

Al final el assert_template parece que no está mal del todo y permite
no ponerle el .html.erb que quedaba bastante feo aunque la barrita '_'
sí que le hace falta.

Saludos
f.
89e7c8b162c71e9905fbfe7d2ec376dc?d=identicon&s=25 Fernando Blat (ferblape)
on 2009-01-26 17:43
(Received via mailing list)
Me temo que si es el render principal sólo tienes un assert_template.

En Rspec sí que hay tests de parcial y de layout.

Y en tu odiado shoulda también hay de layout :)

2009/1/26 Fernando Guillen <fguillen.mail@gmail.com>:
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2009-01-26 18:37
(Received via mailing list)
El día 26 de enero de 2009 17:42, Fernando Blat <ferblape@gmail.com>
escribió:> Me temo que si es el render principal sólo tienes un assert_template.
>
> En Rspec sí que hay tests de parcial y de layout.
>
> Y en tu odiado shoulda también hay de layout :)

:P
This topic is locked and can not be replied to.