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