2011-02-09 8 views
20

Soy bastante nuevo en los rieles y TDD (como sin duda será obvio por mi publicación) y estoy teniendo un momento difícil envolviendo mi cerebro alrededor de Rspec y FactoryGirl.FactoryGirl + RSpec + Rails 3 'método indefinido <attribute> ='

estoy usando Rails 3, rspec y la fábrica de niña:

gem 'rails', '3.0.3' 
# ... 
gem 'rspec-rails', '~>2.4.0' 
gem 'factory_girl_rails' 

Tengo un modelo de usuario que he estado funcionando con éxito pruebas en durante el desarrollo, pero luego tenía que añadir un atributo a, llamada "fuente". Es para determinar de dónde vino el registro del usuario (local vs LDAP).

En mi archivo factories.rb, he definido varias fábricas, que parecen algo así como lo siguiente:

# An alumnus account tied to LDAP 
Factory.define :alumnus, :class => User do |f| 
    f.first_name "Mickey" 
    f.last_name "Mouse" 
    f.username "mickeymouse" 
    f.password "strongpassword" 
    f.source  "directory" 
end 

Tengo una macro definida (que ha estado trabajando hasta ahora) que tiene este aspecto:

def login(user) 
    before(:each) do 
    sign_out :user 
    sign_in Factory.create(user) 
    end 
end 

voy a llamar a él de varias especificaciones como tal (ejemplo de users_controller_spec.rb):

describe "for non-admins or managers" do 
    login(:alumnus) 

    it "should deny access" do 
    get :index 
    response.should redirect_to(destroy_user_session_path) 
    end 

end 

Si no se especifica el atributo "fuente", todo funciona bien, pero tan pronto como lo hago, me sale un error al igual que cuando se ejecuta la prueba

12) UsersController for non-admins or managers should deny access 
Failure/Error: Unable to find matching line from backtrace 
NoMethodError: 
    undefined method `source=' for #<User:0x00000100e256c0> 

puedo tener acceso al atributo ningún problema desde el Rieles de la consola y la aplicación en sí, y está en la lista de mi attr_accessible en el modelo de usuario. Es casi como si Rspec estuviera viendo una versión anterior de mi modelo y no reconociera que le he agregado un atributo. Pero si pongo la siguiente línea en mi modelo de usuario, el error desaparece

attr_accessor :source 

... lo cual me indica que en realidad está mirando el modelo correcto.

¡Ayuda!

Respuesta

54

¿Qué tal si ejecuta esto?

rake db:test:load 

[Si ha añadido un nuevo atributo que había necesidad de migrar a la base de datos de prueba.]

+2

Gracias! Sí, eso es todo ... se olvidó de usar la base de datos de prueba ... – dearlbry

+2

¡Gran ahorro! Gracias @ TK-421. Totalmente olvidé que estaba en la prueba db ... – MorningHacker

+0

Que Dios te bendiga Señor – ant

5

si no se utiliza schema.rb (por ejemplo, que haya configurado config.active_record.schema_format = :sql) que debiera ejecutar

rake db:test:prepare 
Cuestiones relacionadas