【问题标题】:find_failed_line error in rspec-corerspec-core 中的 find_failed_line 错误
【发布时间】:2016-01-23 07:37:20
【问题描述】:

我正在使用pry-rescue 1.4.2,当我的测试失败时,它不会让我进入 Pry,它只会给我这个错误:

UsersController
  DELETE #destroy
    when the inviter is being deleted and invited has not accepted invitation
WARNING: Tried to inspect exception outside of Pry::rescue{ }
      should confirm that the inviter_membership has a valid member_id (FAILED - 1)
WARNING: Tried to inspect exception outside of Pry::rescue{ }
      should successfullly destroy that user record (FAILED - 2)

/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:263:in `find_failed_line': undefined method `find' for nil:NilClass (NoMethodError)
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:244:in `read_failed_line'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:226:in `failure_lines'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:174:in `colorized_message_lines'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:272:in `formatted_message_and_backtrace'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:199:in `fully_formatted'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:110:in `block in fully_formatted_failed_examples'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:109:in `each'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:109:in `each_with_index'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/notifications.rb:109:in `fully_formatted_failed_examples'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/formatters/base_text_formatter.rb:33:in `dump_failures'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/reporter.rb:146:in `block in notify'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/reporter.rb:145:in `each'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/reporter.rb:145:in `notify'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/reporter.rb:124:in `finish'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/reporter.rb:64:in `report'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:108:in `run_specs'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:86:in `run'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:70:in `run'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:38:in `invoke'
/.rvm/gems/ruby-2.2.3@myapp/gems/rspec-core-3.2.3/exe/rspec:4:in `<top (required)>'
/.rvm/gems/ruby-2.2.3@myapp/bin/rspec:23:in `load'
/.rvm/gems/ruby-2.2.3@myapp/bin/rspec:23:in `<main>'
/.rvm/gems/ruby-2.2.3@myapp/bin/ruby_executable_hooks:15:in `eval'
/.rvm/gems/ruby-2.2.3@myapp/bin/ruby_executable_hooks:15:in `<main>'

这些是它失败的测试:

RSpec.describe UsersController, :type => :controller do
  include ApplicationHelper
  include RelationshipConversions

  describe 'DELETE #destroy' do
    it "should find the correct user record"

    context "when the inviter is being deleted and invited has not accepted invitation" do
      before :each do
        user1 = create(:user, gender: 0)
        user2 = create(:user)
        member = create(:member, email: user2.email, first_name: user2.first_name, last_name: user2.last_name, bio: user2.bio, gender: user2.gender)
        membership = create(:membership, member: member, family_tree: user1.family_tree, inviter: user1, relation: "sister")
        connection = create(:connection, inviter_membership: membership)
        login_user
      end

      it "should confirm that the inviter_membership has a valid member_id" do
        expect(@user1.inviter_memberships.first.member?).to_be true
      end

      it "should successfullly destroy that user record" do
        delete :destroy, @user
        it { should respond_with(200) }
      end
    end

我以为是我使用的 Ruby 版本,所以我升级到了ruby 2.2.3p173

然后我做了一个新的bundle install 并提取了我正在使用的所有最新版本的 gem。还是没有骰子。

这可能是什么原因造成的?

编辑 1

当我在不使用rescue rspec /file/path/to/spec.rb 的情况下执行我的规范时快速更新,它给了我一个stack level too deep 错误。具体来说:

 1) UsersController DELETE #destroy when the inviter is being deleted and invited has not accepted invitation should confirm that the inviter_membership has a valid member_id
     Failure/Error: membership = create(:membership, member: member, family_tree: user1.family_tree, inviter: user1, relation: "sister")
     SystemStackError:
       stack level too deep

# /gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:22:in `visit'
 # /gems/arel-5.0.1.20140414130214/lib/arel/visitors/depth_first.rb:11:in `visit'
 # /gems/arel-5.0.1.20140414130214/lib/arel/visitors/depth_first.rb:91:in `visit_Arel_Attribute'
 # /gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:22:in `visit'
 # /gems/arel-5.0.1.20140414130214/lib/arel/visitors/depth_first.rb:11:in `visit'
 # /gems/arel-5.0.1.20140414130214/lib/arel/visitors/depth_first.rb:162:in `block in visit_Array'

对于其他失败的测试也是如此。它在同一 membership = create(:membership...) 行上失败。

这是我的Memberships Factory

FactoryGirl.define do
  factory :membership do
    family_tree
    association :inviter, factory: :user
    association :invited, factory: :user
    association :inviter_connection, factory: :connection
    association :invited_connection, factory: :connection
    relation { Faker::Lorem.word }
    member
  end
end

这可能是什么原因造成的?

编辑 2

我们在工厂中的after_create 回调方面取得了进展。但有关如何设置关联的更多详细信息,请考虑以下事项:

class Membership < ActiveRecord::Base
  belongs_to :family_tree
  belongs_to :member
  belongs_to :inviter, class_name: "User", foreign_key: "user_id"
  belongs_to :invited, class_name: "User", foreign_key: "invited_id"
  has_one :inviter_connection, class_name: "Connection", foreign_key: "membership_id", dependent: :destroy
  has_one :invited_connection, class_name: "Connection", foreign_key: "invited_membership_id", dependent: :destroy
end

连接:

class Connection < ActiveRecord::Base
  belongs_to :inviter_membership, class_name: "Membership", foreign_key: "membership_id"
  belongs_to :invited_membership, class_name: "Membership", foreign_key: "invited_membership_id"
  belongs_to :invited_user, class_name: "User", foreign_key: "invited_user_id"
  belongs_to :inviter_user, class_name: "User", foreign_key: "inviter_user_id"

  validates :request_status, presence: true

  enum request_status: { pending: 0, accepted: 1, rejected: 2, removed: 3 }
end

会员:

class Member < ActiveRecord::Base
    has_many :memberships    
end

用户:

class User < ActiveRecord::Base
  has_one :family_tree, dependent: :destroy
  has_many :memberships
  has_many :inviter_memberships, class_name: "Membership", foreign_key: "user_id"
  has_many :invited_memberships, class_name: "Membership", foreign_key: "invited_id", dependent: :destroy
  has_many :inviter_connections, class_name: "Connection", foreign_key: "inviter_user_id"
  has_many :invited_connections, class_name: "Connection", foreign_key: "invited_user_id"
end

家谱:

class FamilyTree < ActiveRecord::Base
  belongs_to :user
  has_many :memberships, dependent: :destroy
  has_many :active_members, through: :memberships, source: :invited, dependent: :destroy
  has_many :passive_members, through: :memberships, source: :member, dependent: :destroy
end

【问题讨论】:

  • 您是否尝试过在describe 块之外使用include 语句?
  • @PeterAlfvin 刚试了一下,还是不行。
  • 看起来你的connection 有一个membership 有一个connection 等等,所以会生成一个无限循环并引发stack level too deep
  • 好点。在这种情况下我将如何解决这个问题?不在声明中将它们都关联起来,或者在工厂中删除关联?换句话说,当我明确设置该关联时,如何防止工厂创建新记录 - 这似乎是它正在做的事情?

标签: ruby-on-rails ruby ruby-on-rails-4 rspec


【解决方案1】:

看起来问题与工厂之间的关联有关,connection factory 有一个 membershipmembership 有一个 connection

如果删除membership factory 的以下几行:

association :inviter_connection, factory: :connection
association :invited_connection, factory: :connection

并附加以下内容:

after(:create) do |membership, evaluator|
  membership.inviter_connection = FactoryGirl.create(:connection, inviter_membership: membership)
  membership.invited_connection = FactoryGirl.create(:connection, invited_membership: membership)
end

这可能是解决方案。请注意,其他关联也可能发生同样的情况

【讨论】:

  • 仍然遇到同样的错误。我将在我的connections 工厂中尝试同样的事情,但我不确定为什么会这样,因为连接端没有创建明显的递归循环......我不认为。
  • membership = create(:membership, member: member, family_tree: user1.family_tree, inviter: user1, relation: "sister") 发生错误,因此以下任何关联都可能是问题:invitedinviter_connectioninvited_connection,请尝试删除所有关联并一一添加,然后当您遇到问题时,尝试生成after(:create) 并再次测试
  • 实际关联的样子重要吗?至于哪一边有belongs_to,哪一边有has_manyhas_one。我更新了问题以反映这些关联。
  • 其实...我想我找到了问题所在。问题是在我的工厂中进行关联的方式。鉴于connection.rb 具有相应成员关系的foreign_key,如果我在Memberships 工厂中删除那些connection 关联,它实际上工作得很好。所以似乎我错误地设置了我的工厂。如果您修改答案以反映这一点,我会接受。谢谢你的一切!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多