2012-03-06 30 views
2

我想用FactoryGirl创建一次性工厂。也就是说,工厂一旦超出范围就不再存在。您可以在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超出范围,就不能引用它了,所以就没有跟工厂污染的物体空间的危险,不用过的。 (如果我想要一个只在特定测试中使用的一次性工厂,我不希望它暴露给我的其余测试。这是sl。。)

这可能吗?如果没有,是否有一颗宝石可以让我做同样的事情?

+0

为什么不只是覆盖与你想要的属性,用户的工厂? 'Factory.build:user,:first_name =>'David',:last_name =>'Jones'' – James 2012-03-06 16:34:55

+0

@James因为这需要在我可以做任何事情之前加载我所有的工厂,而且几乎所有这些工厂对于给出测试。这是不好的隔离和它的马虎测试。 “如果你想从头开始制作一个苹果派,你必须先创建宇宙”是一个不错的Carl Sagan报价,但它不适用于编写单元测试。 – 2012-03-06 17:41:53

+1

如果你想要一次性的工厂进行特定的测试,我的猜测是工厂不是正确的模式,并且你最好用类似'let(:user){User.new(:first_name =>) 'David',:last_name =>'TooSoon')}'或者只是嘲笑+存根。 – 2012-03-06 17:48:29

回答

0

这是哈克,但:

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 
相关问题