我对 Rails 和 TDD 相当陌生(毫无疑问,从我的帖子中可以明显看出),而且我很难理解 Rspec 和 FactoryGirl。
我正在使用 Rails 3、rspec 和 Factory Girl:
gem 'rails', '3.0.3'
# ...
gem 'rspec-rails', '~>2.4.0'
gem 'factory_girl_rails'
我有一个用户模型,在开发过程中已成功运行测试,但随后需要添加一个名为“源”的属性。它用于确定用户记录最初来自哪里(本地还是 LDAP)。
在我的 Factory.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!