Простой вопрос factory_girl - PullRequest
       9

Простой вопрос factory_girl

2 голосов
/ 17 марта 2010

У меня есть две фабрики (post_factory.rb, comment_factory.rb) в отдельных файлах. Я хотел бы создать немного сложную фабрику, которая создаст для меня пост с соответствующими комментариями. Я создал третий файл с именем complex_factory.rb и написал следующий код:

Factory.define :post_with_comments, :parent => :post do |post|
  post.after_create { |p| Factory(:comment, :post => p) }
end

Но rake spec выдает ошибку, утверждая, что файл не знает о фабриках постов и комментариев. В самый следующий момент я наивно написал требования вверху:

require "post_factory.rb"
require "comment_factory.rb"

Но это не дало должного результата. Может быть, для этого нужно смотреть в неправильном направлении? Или они в значительной степени не имеют значения (так как регистрация фабрик для наглядности может быть более сложной, чем я предполагаю).

Я что-то упустил? Есть идеи?

Ответы [ 2 ]

3 голосов
/ 20 марта 2010

На самом деле я понял, что файлы с фабриками видят друг друга. Если у нас есть comment_factory.rb вместе с post_factory.rb, этот следующий код будет работать нормально (пост-фабрика):

Factory.define :post_with_comments do |post|
  post.caption = "Caption"
  post.body "Some dummy text"
  post.after_create { |p| Factory(:comment, :post => p) }
end

Пока comment_factory.rb выглядит следующим образом:

Factory.define :comment do |comment|
  comment.body "Some wise comment text"
  comment.post_id
end
0 голосов
/ 20 марта 2010

Требование, которое вы добавили, не работает, потому что у него нет правильного префикса пути.

Однако factory_girl должна делать это автоматически. См. README в репозитории git . Там написано:

Фабрики могут быть определены где угодно, но будут автоматически загружаться, если они определены в файлах в следующих местах:

test/factories.rb
spec/factories.rb
test/factories/*.rb
spec/factories/*.rb

Ваши фабрики должны находиться за пределами местоположения по умолчанию. Если вы не можете просто переместить их по умолчанию, используйте что-то вроде этого:

Dir[File.expand_path(File.dirname(__FILE__)) + "/factories/*.rb"].each do |file|
    require file
end
...