Ruby on Rails 2.3.8: El comportamiento de destruir alucinante se ignora antes del filtro

Entonces, estoy perdiendo el tiempo con el permiso de usuario de prueba en mi aplicación, pero esta prueba es realmente extraña. Aquí está el filtro anterior que estoy tratando de trabajar en mi ContentsController:

before_filter :only => :destroy do |controller| controller.prevent_packet_sniffing_destroy_hack(controller_name.classify.constantize) end 

Estoy trabajando para que solo este conjunto de pruebas de un controlador funcione, de modo que pueda copiar el filtro anterior en los otros controladores con un comportamiento similar

La prueba:

  should "not allow the deleting of #{plural_name} on different accounts" do login_as(@user) p = Factory(factory_name, :account => Factory(:account)) assert_difference("#{klass}.count", 0) do delete :destroy, :id => p.id klass.find_by_id(p.id).should_not be_nil end end 

Para aquellos interesados, esta es una prueba generalizada de que ejecuto todos los objetos con una funcionalidad similar. Aquí están las variables definidas por el parámetro del método, ‘klass’

  factory_name = klass.name.tableize.singularize.to_sym plural_name = klass.name.tableize singular_name = klass.name.tableize.singularize 

El método de destruir para el controlador que estoy tratando de probar:

  def destroy @content = Content.find(params[:id]) if not has_permission_to_change?(@content) flash[:error] = 'You do not have permission to delete this content.' else @content.destroy end respond_to do |format| format.html { redirect_to(contents_url) } end end 

Los dos métodos que hacen la prueba de permisos:

  def prevent_packet_sniffing_destroy_hack(klass) if not has_permission_to_change?(klass.find(params[:id])) puts "should be denying access" # render :template => "/error/401.html.erb", :status => 401 return false end end def has_permission_to_change?(object) if (current_user.is_standard? and object.user_id != current_user.id) or object.account_id != current_account.id return false else return true end end 

y finalmente, la salida de la consola.

 Loaded suite test/functional/contents_controller_test Started ...should be denying access E........ Finished in 1.068664 seconds. 1) Error: test: destroy contents! should not allow the deleting of contents on different accounts. (ContentsControllerTest): RuntimeError: This content should not be allowed to be deleted 

Notará que en medio de las pruebas, la que falla las impresiones “debería estar denegando el acceso” como en las entradas en mi filtro anterior.

También puse una statement de colocación justo encima del error de flash donde dice “no tiene permiso para eliminar este contenido” y se imprime.

* Nota: la funcionalidad funciona correctamente en el modo de desarrollo, cuando se prueba con un navegador web y un interceptor de paquetes.

Cualquier ayuda es muy apreciada.

Solo vuelve a leer tu prueba:

 begin delete :destroy, :id => p.id raise "This #{singular_name} should not be allowed to be deleted" rescue ActiveRecord::RecordNotFound assert true end 

Lo que estás comprobando es si la acción de destroy va bien o no. Y siempre es así (a menos que no haya Content con la id que pase, pero ¿cómo podría suceder?).

Realmente no pruebas si el objeto es destruido o no.

Deberías reescribirlo de esta manera:

 should "not allow the deleting of #{plural_name} on different accounts" do login_as(@user) p = Factory(factory_name, :account => Factory(:account)) delete :destroy, :id => p.id klass.name.find_by_id(p.id).should be_nil end 

Tenga en cuenta que aquí le faltan pruebas de unidad y que debería aislar un poco más sus casos de uso utilizando talones.