2011-05-05 9 views
5

Tal vez esto no es algo que deba probarse, pero estoy aprendiendo, así que no creo que sea incorrecto probar al máximo.Prueba en contra de la asignación masiva

Tengo varias pruebas que producen todos los resultados esperados excepto uno. Encontré una forma de evitarlo, pero me pregunté cuál sería el método correcto.

Cuando pruebo el ahorro en la consola de rieles, no guarda el campo de administración del hash de params, que es lo que espero. Cuando construyo con una fábrica y luego lo guardo, las validaciones pasan o fallan en consecuencia. Cuando pruebo la protección contra la asignación masiva, la prueba falla (porque establece el campo de administración cuando no lo espero)

¿Alguna idea, sugerencia o inquietud?

, gracias

Modelo:

class User ... 
    #id, name, email, admin(int) 
    attr_accesible :name, email 
    ... 
end 

user_spec

it "should not have an admin after a mass save" do 
    user = Factory.build(:user) 
    user.save 
    user.admin.should be_nil #its not nil, its 0  
end 

fábricas

Factory.define :user do |f| 
    f.name "rec_acro" 
    f.email "[email protected]" 
    f.admin 0 
end 

Respuesta

13

Puede utilizar Shoulda en la parte superior de rspec para obtener una masa concisa una ssignment spec:

+0

No es necesario utilizar RSpec utilizar Shoulda. –

+5

Correcto, pero dado que el OP ya está usando rspec, solo estaba señalando que podrían usarse juntos. –

+1

¿Piensas entonces que la única persona que alguna vez leerá esta pregunta y responderá en busca de ayuda es la OP? Lo estaba notando por otros. –

2

Factory Girl (con razón) no usa la asignación masiva para generar objetos. Tome el objeto de usuario generado de fábrica y luego intente realizar una asignación masiva, aunque solo con el parámetro de administración.

3

FactoryGirl tomará cada atributo en la definición de Fábrica y lo configurará individualmente. Así que su prueba en realidad no prueba la asignación de masas

A partir del código factorygirl (build.rb): (. Ver this si está interesado en más de lectura de códigos de la gema factorygirl)

def set(attribute, value) 
    @instance.send(:"#{attribute}=", value) 
    end 

Como se sugirió otra respuesta, puede usar Shoulda para emplear el marcador allow_mass_assignment_of. Básicamente hace algo como:

it "allows mass assignment of :title" do 
    accessible = Post.accessible_attributes.include?('title') || 
      !Post.protected_attributes.include?('title') 
    accessible.should be_true 
end 

(Here's a little más sobre A En caso de comparadores.)

Cuestiones relacionadas