Подтвердить что ты не робот

FactoryGirl + RSpec + Rails 3 'undefined метод <attribute> ='

Я новичок в рельсах и TDD (как это, несомненно, будет очевидно из моего сообщения), и мне тяжело переносить мой мозг вокруг Rspec и FactoryGirl.

Я использую Rails 3, rspec и factory girl:

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

У меня есть модель пользователя, в которой я успешно выполнял тесты во время разработки, но затем нужно было добавить атрибут, называемый "source". Он предназначен для определения того, откуда первоначально была записана запись пользователя (локальная и 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

..., который указывает мне, что он действительно смотрит на правильную модель.

Help!

4b9b3361

Ответ 1

Как это сделать?

rake db:test:load

[Если вы добавили новый атрибут, вам нужно будет перенести его в тестовую базу данных.]

Ответ 2

если вы не используете schema.rb(например, вы установили config.active_record.schema_format = :sql) вы должны запустить

rake db:test:prepare