Как я могу проверить, что мой дизайн таблицы правильно реализует мои ассоциации?
Я написал свои базовые модели и определил их связи, а также миграции для создания связанных таблиц.
РЕДАКТИРОВАТЬ - Добавление акцента на то, что я специально хочу проверить.
Я хочу иметь возможность проверить:
- Ассоциации настроены как задумано
- Структуры таблиц должным образом поддерживают ассоциации
Я написал фабрики FG для всех моих моделей в ожидании получения полного набора тестовых данных, но я не могу понять, как написать спецификацию для тестирования ассоциаций own_to и has_many.
Например, для Организации, у которой есть Пользователи, я хочу иметь возможность проверить, что в моем образце Организации есть ссылка на моего примера Пользователя.
Organization_Factory.rb:
Factory.define :boardofrec, :class => 'Organization' do |o|
o.name 'Board of Recreation'
o.address '115 Main Street'
o.city 'Smallville'
o.state 'New Jersey'
o.zip '01929'
end
Factory.define :boardofrec_with_users, :parent => :boardofrec do |o|
o.after_create do |org|
org.users = [Factory.create(:johnny, :organization => org)]
end
end
User_Factory.rb:
Factory.define :johnny, :class => 'User' do |u|
u.name 'Johnny B. Badd'
u.email 'jbadd@gmail.com'
u.password 'password'
u.org_admin true
u.site_admin false
u.association :organization, :factory => :boardofrec
end
Organization_spec.rb:
...
it "should have the user Johnny B. Badd" do
boardofrec_with_users = Factory.create(:boardofrec_with_users)
boardofrec_with_users.users.should include(Factory.create(:johnny))
end
...
В этом примере происходит сбой, поскольку список Organization.users и пользователь сравнения:johnny - это отдельные экземпляры одной и той же фабрики.
Я понимаю, что это не следует идеям BDD о том, для чего эти плагины (FG, rspec), казалось, были предназначены, но, поскольку это мое первое приложение для rails, мне неудобно двигаться вперед, не зная, что я настроил свои ассоциации и таблицу структуры правильно.
1 ответ
Ваша фабрика пользователей уже создает организацию благодаря Factory Girl association
метод:
it "should associate a user with an organization" do
user = Factory.create(:johnny)
user.organization.name.should == 'Board of Recreation'
organization = user.organization
organization.users.count.should == 1
end
Посмотрите на log/test.log после запуска вашей спецификации - вы должны увидеть INSERT как для организации, так и для пользователя.
Если вы хотите проверить это без ассоциации Factory Girl, создайте фабрику, которая просто создает пользователя, и создайте ассоциацию в спецификации:
it "should associate a user with an organization" do
user = Factory.create(:johnny_no_org)
org = Factory.create(:boardofrec)
org.users.should be_empty
org.users << user
org.users.should include(user)
end
Конечно, все, что это делает, это проверяет, выполняет ли ActiveRecord свою работу. Поскольку ActiveRecord уже полностью протестирован, вам нужно сконцентрироваться на тестировании функциональности вашего приложения, как только вы убедитесь, что фреймворк действительно выполняет то, что должен делать.