Ruby on rails “你能构造”吗;“一次性”;工厂里的工厂女孩?
我想用FactoryGirl创建一次性工厂。也就是说,一旦超出范围,工厂就不复存在了 大多数工厂的定义如下:Ruby on rails “你能构造”吗;“一次性”;工厂里的工厂女孩?,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,我想用FactoryGirl创建一次性工厂。也就是说,一旦超出范围,工厂就不复存在了 大多数工厂的定义如下: Factory.define(:user) do first_name "James" last_name "Smith" end u = Factory.build(:user) 但这样做意味着FactoryGirl永远持有对:user工厂的引用。无论您在何处,Factory.build(:user)表示您之前定义的版本。我想要的是这样的东西: f = Factory.t
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
超出范围,您就不能再引用它,因此不会有因未使用的工厂而污染对象空间的危险。(如果我想要一个只在特定测试中使用的一次性工厂,我不希望它暴露在我的其余测试中。这太草率了。)
可能吗?如果没有,是否有一个gem可以让我做一些类似的事情?这是很有意思的,但是:
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
这很有意思,但是:
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
为什么不使用所需的属性覆盖用户工厂
Factory.build:user,:first\u name=>'David',:last\u name=>'Jones'
@James因为这需要在我做任何事情之前加载我的所有工厂,并且几乎所有这些工厂对于给定的测试都是无用的。这是一个糟糕的隔离,也是一个草率的测试。“如果你想从头开始做一个苹果派,你必须先创建一个宇宙”是一句很好的卡尔·萨根的名言,但它不应该应用于编写单元测试。如果你想为特定测试创建一个一次性工厂,我的猜测是工厂不是正确的模式,最好使用let(:user){user.new之类的东西(:first_name=>'David',:last_name=>'TooSoon')}
或只是mock+stubs.@BenTaitelbaum这会起作用,但我无法利用FactoryGirl提供的有用行为(在构建之后
,等等)但是+1。为什么不直接用你想要的属性覆盖用户工厂呢?factory.build:user,:first\u name=>'David',:last\u name=>'Jones'
@James,因为这需要在我做任何事情之前加载我的所有工厂,而几乎所有这些工厂对于给定的测试都是无用的。Tha这是糟糕的隔离和草率的测试。“如果你想从头开始做苹果派,你必须先创造宇宙”是一个很好的Carl Sagan引用,但是它不应该应用于编写单元测试。如果你想要一个用于特定测试的一次性工厂,我的猜测是工厂不是正确的模式,最好使用let(:user){user.new(:first_name=>David',:last_name=>TooSoon')之类的东西
或者只是mock+stubs。@BenTaitelbaum可以,但我不能利用FactoryGirl提供的有用行为(在构建之后
,等等),我必须自己编写。+1尽管如此。