TestCase: assert_render_partial


#1

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:

:stuck_out_tongue:

f.


#2

On Sat, Jan 24, 2009 at 2:21 AM, Fernando G.
removed_email_address@domain.invalidwrote:

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.


#3

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 removed_email_address@domain.invalid
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:

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.


#4

El día 26 de enero de 2009 17:42, Fernando B. removed_email_address@domain.invalid
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 :slight_smile:

:stuck_out_tongue:


#5

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 :slight_smile:

2009/1/26 Fernando G. removed_email_address@domain.invalid: