【问题标题】:Can you construct "one-off" factories in FactoryGirl?你能在 FactoryGirl 中建造“一次性”工厂吗?
【发布时间】:2012-03-06 15:11:39
【问题描述】:

我想使用 FactoryGirl 创建一次性工厂。也就是说,一旦超出范围,工厂就不再存在。

大多数工厂的定义如下:

Factory.define(:user) do
  first_name "James"
  last_name  "Smith"
end

u = Factory.build(:user)

但是这样做意味着 FactoryGirl 永远持有对 :user 工厂的引用。无论您身在何处,Factory.build(:user) 都表示您之前定义的那个。我想要的是这样的:

f = Factory.temporary(:user) do
  first_name "David"
  last_name  "Jones"
end

u = f.build

一旦f 超出范围,您就不能再引用它,因此不会有不使用的工厂污染您的对象空间的危险。 (如果我想要一个只用于特定测试的一次性工厂,我不希望它暴露在我的其余测试中。这太草率了。)

这可能吗?如果没有,是否有宝石可以让我做类似的事情?

【问题讨论】:

  • 为什么不用你想要的属性覆盖用户工厂呢? Factory.build :user, :first_name => 'David', :last_name => 'Jones'
  • @James 因为这需要在我做任何事情之前加载我所有的工厂,而且几乎所有这些工厂对于给定的测试都是无用的。那是糟糕的隔离,而且是草率的测试。 “如果你想从头做一个苹果派,你必须先创造宇宙”是卡尔萨根的一句好话,但它不应该适用于编写单元测试。
  • 如果你想要一个用于特定测试的一次性工厂,我的猜测是工厂不是正确的模式,你最好使用let(:user) { User.new(:first_name => 'David', :last_name => 'TooSoon') } 或只是模拟+存根之类的东西.
  • @BenTaitelbaum 可以,但是我无法利用 FactoryGirl 提供的有用行为(after_build 等),我必须自己编写。 +1 虽然。

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


【解决方案1】:

这很老套,但是:

module FactoryGirl
  class Registry
    def remove(name)
      @items[name.to_sym] = nil
    end
  end
end

before do
  Factory(:my_user, :parent => :user) do |f|
    f.first_name "David"
  end
end

after do
  FactoryGirl.factories.remove(:my_user)
end

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多