Factory Girl after_build обратный вызов и переопределение проблемы в rspec - PullRequest
3 голосов
/ 25 июля 2011

У нас возникла проблема с новым обратным вызовом after_build от Factory Girl, который заставил работать параметры переопределения. мы определили модель как:

factory :widget do
  name "Widget Name"
  position 1
  creator
  content_type "text_content"
  content "This is the content"
  change_comment "This is the change comment"
  after_build do |widget|
    widget.page = Factory.create(:page)
    widget.canvas = widget.page.canvas
  end
end

обратите внимание, что для страницы и виджета в этом примере требуется холст; виджет может иметь страницу. мы хотим, чтобы фабрика создала виджет, принадлежащий странице, а виджет и страница принадлежали одному и тому же холсту.

у нас есть тест rspec, который должен проверить, что отсутствие действительного холста делает модель виджета недействительной

context "Canvas" do
    it "should be required" do
        widget = Factory.build(:widget, :canvas => nil)
        widget.should_not be_valid
    end
end

т.е. Factory.build (: widget,: canvas => nil) не должен быть допустимым, поскольку холст передается в nil, однако метод after_build игнорирует это и все еще применяет холст к модели.

Примечание: мы можем обойти эту проблему, изменив тест rspec на следующий, где мы создадим правильную модель, затем установим холст равным nil как 2-й шаг, и это работает правильно, т.е.

context "Canvas" do
    it "should be required" do
        widget = Factory.build(:widget)
        widget.canvas = nil
        widget.should_not be_valid
    end
end

однако такое ощущение, что мы потеряли некоторые основные функции Factory Girl, поэтому мы надеемся, что в нашей фабричной модели для девочек упущено что-то, что позволит нам сделать это более правильно. Очень ценю любые идеи, которые люди могут предоставить!

1 Ответ

4 голосов
/ 28 августа 2012

Я не думаю, что смогу прокомментировать вопрос, поэтому я опубликую исправление к немного другой проблеме с вашим кодом здесь.

Я думаю, что ваша фабрика виджетов всегда будет создавать новую страницу / холст, даже если вы передадите ненулевую страницу / холст в Factory.build / Factory.create. Вот решение для этого, за исключением для случаев ноль / ложь:

after_build do |widget|
  widget.page   ||= Factory.create(:page)
  widget.canvas ||= widget.page.canvas
end

Я все еще ищу решение для случаев фальси ...

...