【发布时间】: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