【发布时间】: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