FactoryGirl + RSpec + Rails 3'未定义方法<attribute> ='</attribute>

时间:2011-02-09 19:07:50

标签: ruby-on-rails-3 rspec2 factory-bot

对于rails和TDD我是相当新的(毫无疑问,从我的帖子中可以明显看出来)并且很难将我的大脑包裹在Rspec和FactoryGirl周围。

我正在使用Rails 3,rspec和工厂女孩:

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

...这表明它实际上正在查看正确的模型。

帮助!

2 个答案:

答案 0 :(得分:55)

跑这个怎么样?

rake db:test:load

[如果添加了新属性,则需要将其迁移到测试数据库。]

答案 1 :(得分:6)

如果您不使用schema.rb(例如,您已设置config.active_record.schema_format = :sql) 你应该跑

rake db:test:prepare