未定义方法“password_confirmation”适合用户:使用 Cucumber 和 Factory Girl 测试 Authlogic
当我单独测试它们时,我的测试工作正常,
rake cucumber FEATURE = 'path/to/feature'
但是当我尝试运行时,
rake cucumber
它们失败并出现以下错误
undefined method `password_confirmation=' for #<User:0x1069545f0> (NoMethodError)
当我尝试使用 Factory.build(:user) 创建用户时,会出现此错误。我有一个定义 :user 的工厂文件。
我真的不知道如何确认这一点,但好像 authlogic 不存在并且用户模型还没有添加的方法。当我在工厂尝试构建新用户时查看用户方法(User.new.methods.include?(“password_confirmation =”))时,有一个由该名称定义的方法。
我对此进行了大量搜索,但没有看到任何相关内容,所以我假设这是我正在做的其他事情。
编辑:
更多信息 - 我已经能够在一个简单的情况下重现这一点:
------- .feature
Background:
Given user "Bad Admin" with email address "[email protected]" and password "password" exists with "admin" credentials
Given user "Good Admin" with email address "[email protected]" and password "password" exists with "edit" credentials
Scenario: valid log in with authorization
When I go to the login page
Scenario: invalid login
When I go to the login page
----factorys.rb
Factory.define :user do |u|
u.first_name "Arthur"
u.last_name "Dent"
u.email { Factory.next(:user_email) }
u.password "default"
u.password_confirmation "default"
end
----steps.rb
Given /^user "([^"]*)" with email "([^"]*)", password "([^"]*)" and credentials "([^"]*)" exists$/ do |name, email, password, role|
names = name.split(' ')
user = Factory(:user, :first_name => names.first, :last_name => names.last, :email => email, :password => password, :password_confirmation => password)
user.has_role! role.downcase.gsub(' ', '_')
end
My tests work fine when I'm testing them individually,
rake cucumber FEATURE = 'path/to/feature'
but when I try to run
rake cucumber
They fail with the following error
undefined method `password_confirmation=' for #<User:0x1069545f0> (NoMethodError)
This comes up when I try to create a user using Factory.build(:user). I have a factories file that defines a :user.
I don't really know how to confirm this, but its as though authlogic is not present and the User model does not have the added methods yet. When I look at the User methods (User.new.methods.include?("password_confirmation=")) at the time the Factory tries to build a new user, there is a method defined by that name.
I've done a lot of searching on this, and I don't see anything related, so I'm assuming that it's something else that I am doing.
EDIT:
A little more information - I've been able to reproduce this in a simple case:
------- .feature
Background:
Given user "Bad Admin" with email address "[email protected]" and password "password" exists with "admin" credentials
Given user "Good Admin" with email address "[email protected]" and password "password" exists with "edit" credentials
Scenario: valid log in with authorization
When I go to the login page
Scenario: invalid login
When I go to the login page
---- factories.rb
Factory.define :user do |u|
u.first_name "Arthur"
u.last_name "Dent"
u.email { Factory.next(:user_email) }
u.password "default"
u.password_confirmation "default"
end
---- steps.rb
Given /^user "([^"]*)" with email "([^"]*)", password "([^"]*)" and credentials "([^"]*)" exists$/ do |name, email, password, role|
names = name.split(' ')
user = Factory(:user, :first_name => names.first, :last_name => names.last, :email => email, :password => password, :password_confirmation => password)
user.has_role! role.downcase.gsub(' ', '_')
end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在步骤定义文件中的某处,您应该使用
before
步骤方法激活 Authlogic:您的用户工厂应该如下所示:
但您不需要使用 Factory 来创建用户。这是我的注册和现有用户的场景:
工厂将在第二个场景中使用。相应步骤的定义:
Somewhere in your step definition file you should activate Authlogic with a
before
step method:Your user's factory should look like this one:
But you don't need to use Factory for user creation. Here is my scenario for sign up and for existing user:
Factory will be used in second scenario. Corresponding step's definitions: