2014-02-14 49 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

我更新了我的答案! –