Rails测试堆栈导致用户验证失败

时间:2013-12-28 17:21:37

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

更新:Forgery生成的第一个电子邮件地址始终是相同的。后续的是不同的,但第一个总是相同的。我相信这可能是我遇到问题的原因。

我已经解决了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 UserPlan。阅读文档后,如果我使用Forgery gem,我仍然不清楚如何获得重复的电子邮件。有人可以帮忙吗?显然我不能再花时间在这上面了。

2 个答案:

答案 0 :(得分:1)

您的login_user方法引用user来指定电子邮件值,但不清楚user的定义位置。我猜它会在每次连续调用此方法时返回相同的值。如果您不清楚定义user的位置,则可能需要在defined?(user)的开头输出login_user以查看它是什么类型的对象。

答案 1 :(得分:0)

我能够通过强制升级到〜>来解决这个问题。 2.14.0适用于RSpecrspec-rails,并按照找到的路线here进行操作。