Factory indefinido + RSpec + Rails 3 'método indefinido <atributo> ='
Eu sou bastante novo em trilhos e TDD (como sem dúvida será óbvio no meu post) e estou tendo dificuldade em envolver meu cérebro em torno do Rspec e FactoryGirl.
Estou usando o Rails 3, rspec e garota de fábrica:
gem 'rails', '3.0.3'
# ...
gem 'rspec-rails', '~>2.4.0'
gem 'factory_girl_rails'
Eu tenho um modelo de usuário no qual eu tenho executado testes com sucesso durante o desenvolvimento, mas precisava adicionar um atributo, chamado "source". É para determinar de onde o registro do usuário veio originalmente (local vs LDAP).
No meu arquivo factories.rb, tenho várias fábricas definidas, que se parecem com o seguinte:
# 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
Eu tenho uma macro definida (que está trabalhando até agora) que se parece com isso:
def login(user)
before(:each) do
sign_out :user
sign_in Factory.create(user)
end
end
Estou chamando-o em várias especificações como esta (exemplo 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
Se eu não especificar o atributo "source", tudo funcionará bem, mas assim que eu faço, recebo um erro assim ao executar o teste
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>
Posso acessar o atributo sem problemas no console do rails e no próprio aplicativo, e ele está listado em meu attr_accessible no modelo de usuário. É quase como se o Rspec estivesse vendo uma versão antiga do meu modelo e não reconhecendo que eu adicionei um atributo a ele. Mas se eu colocar a seguinte linha no meu modelo de usuário, o erro desaparecerá
attr_accessor :source
... o que indica para mim que ele está realmente olhando para o modelo correto.
Socorro!