我已经解决了3天的问题,试图通过它来了解这些测试是如何工作的。但我不知所措。
我有一个用户模型和一个factory_girl
用户工厂。看起来像这样:
FactoryGirl.define do
factory :user do
sequence(:email) { |n| Forgery(:internet).email_address }
sequence(:company) { |n| Forgery(:name).company_name }
password "password"
password_confirmation "password"
active true
admin false
trait :admin do
admin true
end
trait :inactive do
active false
end
end
end
我有一堆规格要运行,我在使用Guard
时一次运行一个规格。在我的规格的顶部,我有这一行:
let!(:user) { login_user }
在spec/support
中,我有一个名为login_macros.rb
的文件,如下所示:
module LoginMacros
def login_user
plan = FactoryGirl.create(:plan, name: "Test Multi")
user = FactoryGirl.create(:user)
subscription = FactoryGirl.create(:subscription, plan: plan) # Fails here
visit login_path
fill_in 'Email', :with => user.email
fill_in 'Password', :with => user.password
click_button 'Go'
user
end
end
查看上面以subscription =
开头的那一行?失败并出现以下错误:
Failure/Error: let!(:user) { login_user }
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken
我的Subscription
工厂看起来像这样:
FactoryGirl.define do
factory :subscription do
end
end
我不知道那家工厂是否正确。在我的应用中,Subscription belongs_to User
和Plan
。阅读文档后,如果我使用Forgery
gem,我仍然不清楚如何获得重复的电子邮件。有人可以帮忙吗?显然我不能再花时间在这上面了。
答案 0 :(得分:1)
您的login_user
方法引用user
来指定电子邮件值,但不清楚user
的定义位置。我猜它会在每次连续调用此方法时返回相同的值。如果您不清楚定义user
的位置,则可能需要在defined?(user)
的开头输出login_user
以查看它是什么类型的对象。
答案 1 :(得分:0)
我能够通过强制升级到〜>来解决这个问题。 2.14.0适用于RSpec
和rspec-rails
,并按照找到的路线here进行操作。