对于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
...这表明它实际上正在查看正确的模型。
帮助!
答案 0 :(得分:55)
跑这个怎么样?
rake db:test:load
[如果添加了新属性,则需要将其迁移到测试数据库。]
答案 1 :(得分:6)
如果您不使用schema.rb(例如,您已设置config.active_record.schema_format = :sql
)
你应该跑
rake db:test:prepare