Я довольно новичок в рельсах и TDD (как, без сомнения, будет очевидно из моего поста), и мне тяжело оборачиваться вокруг Rspec и FactoryGirl.
Я использую Rails 3, rspec и factory girl:
gem 'rails', '3.0.3'
# ...
gem 'rspec-rails', '~>2.4.0'
gem 'factory_girl_rails'
У меня есть пользовательская модель, на которой я успешно выполнял тесты во время разработки, но затем мне нужно было добавить атрибут, называемый «источник». Он предназначен для определения того, откуда исходная запись пользователя (локальная или LDAP).
В моем файле factories.rb я определил несколько фабрик, которые выглядят примерно так:
# 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
У меня есть определенный макрос (он работал до сих пор), который выглядит следующим образом:
def login(user)
before(:each) do
sign_out :user
sign_in Factory.create(user)
end
end
Я называю это в нескольких спецификациях, например, так (пример из 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
Если я не указываю атрибут «source», все работает нормально, но, как только я это делаю, я получаю сообщение об ошибке, например, при запуске теста
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>
Я могу получить доступ к атрибуту без проблем из консоли rails и самого приложения, и он указан в моем attr_accessible в пользовательской модели. Как будто Rspec видит старую версию моей модели и не распознает, что я добавил к ней атрибут. Но если я добавлю следующую строку в мою модель пользователя, ошибка исчезнет
attr_accessor :source
... что указывает на то, что он действительно смотрит на правильную модель.
Помощь!