Factory Girl: использование последовательности в строке, а не в строке - PullRequest
1 голос
/ 04 января 2012

Есть (по крайней мере?) Два способа использовать последовательность на заводской девушке:

Factory.sequence :my_id do |n|
  "#{n}"
end

Factory.define :my_object do |mo|
  mo.id        Factory.next :my_id
end

и просто сделать ее встроенной:

Factory.define :my_object do |mo|
  mo.sequence(:id)    { |n| "#{n}" }
end

Мой вопрос такой.Если я использую встроенную версию на двух разных фабриках, будут ли две разные последовательности, которые начинаются с 1 и увеличиваются в тандеме ... это означает, что если я создаю один из каждого типа фабричного объекта, они оба будут иметь идентификатор 1?

Если я использую внешне определенную последовательность на двух разных фабриках, могу ли я получить уникальные идентификаторы для двух объектов?Значит, будут отличаться идентификаторы каждого объекта?

Я пытаюсь подтвердить, является ли приведенное выше поведение точным, потому что я работаю с совершенно глупой моделью данных, пытаясь заставить rspec и заводскую девушку хорошо с ней поиграть,Разработчик базы данных настроил все так, чтобы разные объекты должны были генерировать идентификаторы, которые являются уникальными для множества несвязанных объектов.Изменение модели данных на данном этапе неосуществимо, хотя я бы очень хотел перенести этот материал обратно на Rails.

Ответы [ 2 ]

4 голосов
/ 04 января 2012

При использовании внешне определенных последовательностей на двух разных фабриках вы увидите увеличение идентификаторов по фабрикам. Однако при использовании встроенных последовательностей каждая фабрика будет иметь свою собственную последовательность.

Я создал пример задания с граблями ниже, чтобы проиллюстрировать это. Отображает следующие результаты:

*** External FactoryGirl Sequence Test Results ***
User Name: Name 1
User Name: Name 2
User Name: Name 3
User Name: Name 4
Role: Name 5
Role: Name 6
Role: Name 7
Role: Name 8
*** Internal FactoryGirl Sequence Test Results ***
User Name: Name 1
User Name: Name 2
User Name: Name 3
User Name: Name 4
Role: Role 1
Role: Role 2
Role: Role 3
Role: Role 4

Как видите, при использовании внешних последовательностей число продолжает увеличиваться по мере перехода от пользователя к роли. Однако при использовании встроенной последовательности приращения не зависят друг от друга.

Для этого примера использовались следующие файлы схемы:

create_table "users", :force => true do |t|
  t.string   "name"
  t.string   "email"
end

create_table "roles", :force => true do |t|
  t.string   "name"
end

Пример грабли:

require 'factory_girl_rails'
namespace :sequencetests do
  Rake::Task[:environment].invoke
  task :external do
    FactoryGirl.factories.clear
    desc "Factory Girl Sequence Test using an externally defined sequence"
    puts "*** External FactoryGirl Sequence Test Results ***"
    FactoryGirl.define do
      sequence :name do |n|
        "Name #{n}"
      end
      factory :user do |u|
        name
      end

      factory :role do |r|
        name
      end
    end

    users = buildit(:user)
    roles = buildit(:role)

    puts( showit(users, "User Name: "))
    puts( showit(roles, "Role: "))
  end

  task :inline do
    FactoryGirl.factories.clear
    puts "*** Internal FactoryGirl Sequence Test Results ***"
    desc "Factory Girl Sequence Test using an inline sequence"
    FactoryGirl.define do
      factory :user do |u|
        u.sequence(:name) {|n| "Name #{n}" }
      end

      factory :role do |r|
        r.sequence(:name) {|n| "Role #{n}" }
      end
    end

    users = buildit(:user)
    roles = buildit(:role)

    puts( showit(users, "User Name: "))
    puts( showit(roles, "Role: "))

  end

end
task sequencetests: ['sequencetests:external', 'sequencetests:inline']

def buildit(what)
  items = []
  4.times do
    items << FactoryGirl.build(what)
  end
  items
end


def showit(items, prefix = "Name: ")
  results = ""
  items.each do |item|
    results += "#{prefix}#{item.name}\n"
  end
  results
end

Надеюсь, это поможет объяснить различные возможности при использовании последовательностей в FactoryGirl.

2 голосов
/ 04 января 2012

Да, встроенные версии создадут 2 независимые последовательности, каждая из которых начинается с 1

...