2014-02-14 5 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 документации, может быть, я делаю это все неправильно, и я должен использовать «реальные» объекты? Благодаря!

Update Вот модель, где изменение происходит

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 

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

Update 3

Оказывается, курс не уничтожается. Ни Course.destroy_all, ни course.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', а затем' ожидать (курс) .to be_nil', но это тоже не сработало. Я ошибаюсь, думая, что объекты factory_girl обычно могут быть уничтожены так? – Linus

+0

Какое сообщение об ошибке? –

+0

Я добавил сообщение об ошибке. – Linus

0

Спасибо за помощь! Оказывается, после записи course.destroy напишите enrollment.reload, чтобы увидеть какие-либо изменения, касающиеся регистрации.

тест может выглядеть следующим образом:

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

Отлично! Но я все еще считаю, что синтаксис I цели более читабельен и рекомендуется в документации rspec. Не могли бы вы попробовать 'ожидать {[course.destroy, enrollment.reload]}. Изменить (зачисление,: active) .from (true) .to (false)' пожалуйста? Затем я уточню свой ответ. –

+0

Я обновил свой ответ! –

Смежные вопросы