2016-02-08 3 views
0

У меня есть Profile модель:Тестирование Rails belongs_to модели с Rspec

class Profile < ActiveRecord::Base 
    belongs_to :user 

    def fields_needed_for_completion 
    [self.name, self.city] 
    end 

    def completed? 
    !fields_needed_for_completion.any? { |f| f.nil? || f == "" } 
    end 
end 

Я пытаюсь определить, как писать модульные тесты для модели с belongs_to ассоциации. В частности, я не уверен, как правильно настроить данные для тестов.

До сих пор, я соединил следующее:

describe Profile do 

    subject(:profile) { FactoryGirl.create(:profile) } 

    describe "fields_needed_for_completion" do 
    context "with all fields missing" do 
     it "returns all fields as nil" do 
     expect(profile.fields_needed_for_completion.all? &:blank?).to be true 
     end 
    end 
    end 

    describe "#completed?" do 
    #TO DO 
    end 
end 

два вопроса:

  1. ли это прекрасно использовать FactoryGirl для создания объекта профиля вместо вызова Profile.create напрямую? Там нет установленных на заводе сейчас атрибуты (т.е. фабрика определяется следующим образом: factory :profile do; end)

  2. Как вы можете видеть, модель User не используется вообще в этих спецификациях. Уместно ли тестировать модель отдельно, как это, хотя на практике она будет принадлежать пользователю? Или я должен как-то издеваться над Пользователем?

+2

Несвязанный вопрос, но почему вы заново изобретаете проверки ActiveModel в своей модели профиля? – sevenseacat

ответ

0

Вот как я это вижу:

  1. Да, это хорошо, на самом деле - вы используете FactoryGirl точно так, как он предназначен. Создание тестовых объектов через фабрики (в отличие от явного вызова Model.create) позволяет вам повторно использовать логику создания между несколькими тестами и иметь всю логику создания, связанную с созданием, в одном месте. Это означает, например, что если вы добавите к своей модели новый обязательный (один с проверками) столбец, тогда вам придется настраивать только завод этой модели, а не фиксировать многочисленные ошибки Model.create во время тестов.

  2. Ваш второй вопрос является методологическая, а не технический, так что это гораздо более открытым для interpetation, но вот мои два цента: Я думаю, что это имеет смысл проверить Profile модели как в отдельности так и в отношении с User. Не связанная с пользователем логика может быть протестирована изолированно, и логика, связанная с пользователем, может быть протестирована в этом контексте. Обратите внимание, что FactoryGirl позволяет вам установить этот контекст довольно легко, указав Userassociation у вас Profile завод.

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