DBA*_*DBA 27 ruby ruby-on-rails factory-bot
只要我有一个项目工厂
Factory.define :project do |p|
p.sequence(:title) { |n| "project #{n} title" }
p.sequence(:subtitle) { |n| "project #{n} subtitle" }
p.sequence(:image) { |n| "../images/content/projects/#{n}.jpg" }
p.sequence(:date) { |n| n.weeks.ago.to_date }
end
Run Code Online (Sandbox Code Playgroud)
而且我正在创建项目实例
Factory.build :project
Factory.build :project
Run Code Online (Sandbox Code Playgroud)
到这时,下次我执行Factory.build(:project)时,我将收到一个Project的实例,其标题设置为"project 3 title",依此类推.不奇怪.
现在说我想在这个范围内重置我的计数器.就像是:
Factory.build :project #=> Project 3
Factory.reset :project #=> project factory counter gets reseted
Factory.build :project #=> A new instance of project 1
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最佳方法是什么?
我目前正在使用以下版本:
factory_girl(1.3.1)factory_girl_rails(1.0)
在此先感谢,最好的问候.
bra*_*don 44
只需在回调之前/之后调用FactoryGirl.reload即可.这在FactoryGirl代码库中定义为:
module FactoryGirl
def self.reload
self.factories.clear
self.sequences.clear
self.traits.clear
self.find_definitions
end
end
Run Code Online (Sandbox Code Playgroud)
由于某种原因,调用FactoryGirl.sequences.clear是不够的.执行完全重新加载可能会有一些开销,但是当我尝试使用/不使用回调时,我的测试大约需要30秒才能运行.因此,开销不足以影响我的工作流程.
And*_*w H 11
嘿大家,在通过源代码追踪之后,我终于想出了一个解决方案.如果您正在使用factory_girl 1.3.2(这是我编写本文时的最新版本),您可以将以下代码添加到factories.rb文件的顶部:
class Factory
def self.reset_sequences
Factory.factories.each do |name, factory|
factory.sequences.each do |name, sequence|
sequence.reset
end
end
end
def sequences
@sequences
end
def sequence(name, &block)
s = Sequence.new(&block)
@sequences ||= {}
@sequences[name] = s
add_attribute(name) { s.next }
end
def reset_sequence(name)
@sequences[name].reset
end
class Sequence
def reset
@value = 0
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后,在Cucumber的env.rb中,只需添加:
After do
Factory.reset_sequences
end
Run Code Online (Sandbox Code Playgroud)
我假设如果你在rspec测试中遇到同样的问题,你可以在每个方法之后使用rspecs.
目前,这种方法只考虑工厂内定义的序列,例如:
Factory.define :specialty do |f|
f.sequence(:title) { |n| "Test Specialty #{n}"}
f.sequence(:permalink) { |n| "permalink#{n}" }
end
Run Code Online (Sandbox Code Playgroud)
我还没有编写代码来处理:Factory.sequence ...
希望这有助于所有其他沮丧的人在那里谁不明白为什么在世界工厂女孩不提供这个.也许我会分叉github项目并提交一个带有此修复程序的pull请求,因为它不会更改任何内部功能.
-安德鲁
对于谷歌搜索人:没有进一步扩展,只是做 FactoryGirl.reload
FactoryGirl.create :user
#=> User id: 1, name: "user_1"
FactoryGirl.create :user
#=> User id: 2, name: "user_2"
DatabaseCleaner.clean_with :truncation #wiping out database with truncation
FactoryGirl.reload
FactoryGirl.create :user
#=> User id: 1, name: "user_1"
Run Code Online (Sandbox Code Playgroud)
对我有用
* factory_girl (4.3.0)
* factory_girl_rails (4.3.0)
Run Code Online (Sandbox Code Playgroud)
这是相当古老的,但它是相关关键字在 google 上的最高结果。对于其他遇到此问题的人。
有一个类方法被调用sequence_by_name
以按名称获取序列,然后您可以调用rewind
它并将其重置为 1。
FactoryBot.sequence_by_name(:order).rewind
Run Code Online (Sandbox Code Playgroud)
或者,如果您想全部重置。
FactoryBot.rewind_sequences
Run Code Online (Sandbox Code Playgroud)
根据YetBot Here,需要在测试之间重置序列是一种反模式.
总结一下:
如果您有这样的事情:
FactoryGirl.define do
factory :category do
sequence(:name) {|n| "Category #{n}" }
end
end
Run Code Online (Sandbox Code Playgroud)
您的测试应如下所示:
Scenario: Create a post under a category
Given a category exists with a name of "Category 1"
And I am signed in as an admin
When I go to create a new post
And I select "Category 1" from "Categories"
And I press "Create"
And I go to view all posts
Then I should see a post with the category "Category 1"
Run Code Online (Sandbox Code Playgroud)
不是这个:
Scenario: Create a post under a category
Given a category exists
And I am signed in as an admin
When I go to create a new post
And I select "Category 1" from "Categories"
And I press "Create"
And I go to view all posts
Then I should see a post with the category "Category 1"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11560 次 |
最近记录: |