Factory Girl after_build回调并覆盖rspec中的问题

时间:2011-07-25 17:55:40

标签: ruby-on-rails ruby-on-rails-3 rspec factory-bot

我们遇到了Factory Girl的新after_build回调问题,并使覆盖参数生效。我们将模型定义为:

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作为第二步,这确实可以正常工作,即

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 个答案:

答案 0 :(得分:4)

我认为我不能对这个问题发表评论,因此我会在此处针对您的代码发布一个稍微不同的问题。

我认为即使您将非零页面/画布传递到Factory.build / Factory.create,您的小部件工厂也会始终创建新的页面/画布。这是一个解决方案,之外的nil / false案例:

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

我仍在为虚假案件寻找解决方案......