Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails “你能构造”吗;“一次性”;工厂里的工厂女孩?_Ruby On Rails_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails “你能构造”吗;“一次性”;工厂里的工厂女孩?

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

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

可能吗?如果没有,是否有一个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尽管如此。