Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带工厂女孩的RSpec-销毁对象_Ruby On Rails_Activerecord_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails 带工厂女孩的RSpec-销毁对象

Ruby on rails 带工厂女孩的RSpec-销毁对象,ruby-on-rails,activerecord,rspec,factory-bot,Ruby On Rails,Activerecord,Rspec,Factory Bot,我不想测试两个模型之间的关系。 一个课程有多个注册,一个注册有一个课程。 当课程被销毁时,所有与之相连的注册都将设置为active=false。这适用于真实对象,我只是无法让测试工作,因为无论我做什么,课程都不会被破坏 describe Enrollment do it "deactivates enrollment" do course = create(:a_course) user = create_user enrollment = build(:enroll

我不想测试两个模型之间的关系。
一个课程有多个注册,一个注册有一个课程。

当课程被销毁时,所有与之相连的注册都将设置为
active=false
。这适用于真实对象,我只是无法让测试工作,因为无论我做什么,课程都不会被破坏

describe Enrollment do
  it "deactivates enrollment" do
    course = create(:a_course)
    user = create_user
    enrollment = build(:enrollment)
    enrollment.course = course
    enrollment.user = user
    enrollment.save

    # until now everything works as expected

    expect { course.destroy }.to change { enrollment.active }.to be_false

    # the course isn't being destroyed when calling course.destroy

  end
end
我在factory_girl文档中找不到任何关于销毁factory_girl对象的信息,也许我做错了,我应该使用“真实”对象?谢谢

更新 这是发生变化的模型

class Course < ActiveRecord::Base
  attr_accessible ...

  has_many :users, through: :enrollments
  has_many :enrollments

  before_destroy :deactivate_enrollments

  protected

  def deactivate_enrollments
    enrollments = self.enrollments

    enrollments.each do |e|
      e.active = false
      e.save
    end
  end
end
更新2 这是故障信息

Enrollment
  deactivates enrolment (FAILED - 1)

Failures:

  1) Enrollment deactivates enrollment
     Failure/Error: expect { course.destroy }.to change(enrollment, :active).from(true).to(false)
       active should have been changed to false, but is now true
     # ./spec/models/enrollment_spec.rb:18:in `block (2 levels) in <top (required)>'
注册
停用注册(失败-1)
失败:
1) 注册停用注册
失败/错误:期望{course.destroy}.更改(注册,:active).from(true).to(false)
active本应更改为false,但现在为true
#./spec/models/enrollment_spec.rb:18:in'block(2层)in'
更新3


事实证明,球场并没有被摧毁。无论是
Course.destroy\u all
还是
Course.destroy都不起作用。无论我是否与factory_girl一起创建课程和注册。这怎么可能?更新

我注意到您通过重新加载注册来回答自己的问题,但即便如此,我认为您应该更改rspec语法,使其更具可读性和表达力。最终结果可能是:

expect { 
  course.destroy
  enrollment.reload
}.to change(enrollment, :active).from(true).to(false)

我认为这将是记录代码行为的更好方法,因为它读起来几乎像流利的英语;)

谢谢你的帮助!事实证明,在编写
课程。销毁
后,我必须编写
注册。重新加载
,才能看到有关注册的任何更改

然后,测试可以如下所示:

expect { [course.destroy, enrollment.reload] }.to change { enrollment.active }.to be_false

谢谢,但我得到了同样的失败信息,那仍然是真的。我还试着写
course.destroy
,然后
expect(course.to_-nil
),但效果不太好。我是不是错误地认为工厂女孩的东西通常可以像这样被摧毁?失败的信息是什么?不,这没有改变任何事情。天哪。如果您在销毁之前检查课程的注册集合,它会显示有多少项?让我们看看您的模型,您在其中更改相关注册活动状态。我更新了原始问题并添加了model@Vimsha。您是否将销毁方法存根在某个位置?我不知道。我能试一下吗?太好了!但是,我仍然认为我使用的语法更具可读性,并且在rspec文档中得到了推荐。请尝试
expect{[course.destroy,registration.reload]}。将(注册,:active)从(true).更改为(false)
?然后,我会更新我的答案。
expect { [course.destroy, enrollment.reload] }.to change { enrollment.active }.to be_false