2014-02-14 77 views
3

我不想测试两个模型之间的关系。 A course has many enrollments, an enrollment has one course.RSpec与Factory_girl - 销毁对象

当课程被破坏时,与其相连的所有注册设置为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 

因为我真的不知道这一点,我使用的是测试过程是一个factory_girl对象。它不是这样创建的:Course.create...。 factory_girl对象是否具有与ActiveRecord对象相同的方法?

这里是factory_girl代码:

FactoryGirl.define do 
    factory :course, class: Course do 
    titel "Course title" 
    end 
end 

更新2 这里是failure message

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)>' 

更新3

原来,当然是不被毁坏。 Course.destroy_allcourse.destroy都不起作用。无论我是否创建了课程并通过factory_girl注册。怎么会这样?

+0

这将有助于看看你的模型,其中要更改相关的招生工作状态 – usha

+0

我更新了原来的问题,并且增加了模型@Vimsha。 – Linus

+0

你是否在某处存储了销毁方法? – arieljuod

回答

3

UPDATE

我注意到,您可以通过重装招生,但即便如此回答自己的问题,我想你应该改变你的rspec的语法更具可读性和表现力。最终的结果可能是:

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

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

+0

谢谢,但我得到了同样的失败信息,它仍然是真的。我也试着编写'course.destroy',然后'expect(course).to be_n'',但那不起作用。我错误地认为factory_girl对象通常可以像这样被销毁? – Linus

+0

什么是失败消息? –

+0

我添加了错误信息。 – Linus

0

感谢您的帮助!事实证明,我必须写course.destroy之后,写enrollment.reload才能看到有关注册的任何更改。

测试可以再这个样子:

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

太棒了!但是,我仍然认为我的目的语法更具可读性,并且在rspec文档中推荐使用。你可以试着'期待{[course.destroy,enrollment.reload]}。改变(注册,:活动)。从(真)到(假)'?然后,我会更新我的答案。 –

+0

我更新了我的答案! –