QuasarLog: День первый + Знакомство с FactoryGirl

апреля 27, 2012  |  Published in CMS, QuasarLog  |  10 Comments

Весточка с передовой.

О QuasarLog’е

В этой рубрике я буду писать о прогрессе в разработке Quasar и некоторых интересных вещах, которые вот уже реально могут быть полезны читателям RubyDev. Например в этом посте мы рассмотрим код FactoryGirl фабрики для модели User из Quasar. Об этом я уже писал в нашей группе во вконтакте. Если хотите быть в курсе развития проекта и RubyDev, то вот вам:


За первый день разработки удалось сделать следующее:

  1. Настроить тестовое окружение: RSpec + FactoryGirl + Spork + Guard + DatabaseCleaner
  2. Установить Device и CanCan и кое-как настроить Devise (это еще не принципиально).
  3. Написать спеки для модели User и создать фабрику FactoryGirl.
  4. Написать код по спекам.

Прогресс QuasarCMS можно наблюдать здесь:

Планы на сегодня:

Спеки и код для модели Document, связка Document -> Document, Document -> User.

Фабричная девченка — FactoryGirl

# spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    sequence(:nickname) { |n| "user_#{n}" }
    sequence(:email) { |n| "email_#{n}@email.com" }

    first_name 'Test'
    last_name 'User'
    password '123456'
    password_confirmation '123456'

    factory :reader_user do
      role 'reader'
    end

    factory :admin_user do
      role 'admin'
    end

    factory :moderator_user do
      role 'moderator'
    end
  end
end

FactoryGirl — это простой и удобный DSL для замены традиционных фикстур (fixtures) фабриками объектов. Задача фабрики объектов — плодить экземпляры моделей для тестов. Например приведенную выше фабрику мы можем использовать в спецификациях RSpec:

describe User do
  #...
  describe 'helpers' do
    before :all do
      @user = FactoryGirl.create :reader_user
      @admin = FactoryGirl.create :admin_user
      @moderator = FactoryGirl.create :moderator_user
    end

    describe "reader" do
      subject { @user }

      its(:full_name) { should == "#{@user.first_name} #{@user.last_name}" }
      its(:is_reader?) { should be_true }
    end
    #...
  end
end

Код FactogyGirl достаточно понятен. Используются одноименные с именами свойств модели методы для объявления этих самых свойств порождаемых записей. Метод sequence позволяет генерировать случайные значения свойств. Каждая фабрика объявляется внутри блока кода передаваемого в метод factory. После того, как вы создали фабрику, вы можете легко ее использовать:

FactoryGirl.create :factory_name # создает и сохраняет в БД запись соответствующую фабрике factory_name.
FactoryGirl.build :factory_name # метод аналогичен .create, но запись в БД не происходит.
FactoryGirl.attributes_for :factory_name # возвращает хэш формата { attribute: value } для свойств.

Мы будем более подробно рассматривать FactoryGirl в следующих постах QuasarLog’а.

Tags: , , , , , ,

Responses

  1. says:

    апреля 27, 2012 at 22:36 (#)

    А мне вот fabrication поинтереснее и почище показался, хотя в принципе одно и то же

  2. admin says:

    апреля 28, 2012 at 12:16 (#)

    Михаил, честно говоря не пробовал, да и FactoryGirl как-то поближе уже. Нужно будет на досуге посмотреть.

  3. Валентин says:

    апреля 28, 2012 at 17:13 (#)

    Читал ваши спеки
    # security
    it «allow mass assignment of *role*» do
    should allow_mass_assignment_of :role
    end

    Егор Хомяков за вами выехал ….

  4. admin says:

    апреля 29, 2012 at 02:21 (#)

    Валентин, Егор нам понадобится, когда проект будет готов. Это все — совсем сырой код.

  5. says:

    апреля 29, 2012 at 18:26 (#)

    it has
    it doesn’t
    it validates
    it belongs
    it allows

    я не умничаю, просто глаза режет :)

  6. admin says:

    апреля 29, 2012 at 19:01 (#)

    UseRifle, это понятно, что глаголы с s пишутся для He/she/it, но вот в shoulda_matchers именно belong_to, allow_… и т.д. называются матчеры и потому приходится дублировать это описание в описаниях примеров.

  7. says:

    апреля 29, 2012 at 19:49 (#)

    Владимир, ну так все правильно

    it belongs to
    vs.
    it should belong to

  8. admin says:

    апреля 30, 2012 at 13:12 (#)

    Михаил, ты прав, затупил. Уже поправил.

  9. вут says:

    июля 23, 2012 at 18:50 (#)

    не понял, мы тут английский учим или FactoryGirl?
    аффтар, пиши больше о фабричной девочке!

  10. 18augst says:

    апреля 26, 2014 at 17:00 (#)

    [quote]Установить Device и CanCan и кое-как настроить Devise (это еще не принципиально).[/quote]

    Бро, не путай народ, Devise же…

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.