我正在改进我公司的RSpec测试(速度有点慢(,我怀疑罪魁祸首之一是我们在几乎所有测试中使用的FactoryBot工厂——由于链接,这个工厂会导致一堆不必要的关联。例如:
FactoryBot.define do
# we use a bunch of these and most tests don't care about the value of :b,
# but ActiveRecord validations require it
factory :A do
association :b
# some other attributes with simple types
end
factory :B do
association :c
end
factory :C do
association :d
end
end
如何在不强制创建B
、C
和D
的情况下创建A
的实例(我正计划控制那些具有特征的实例(?到目前为止,使用build_stubbed
策略是我最好的答案(它不能解决所有我的问题,但相当不错(,但我很好奇是否还有其他技巧可以让我推心置腹。
问题很可能是如何创建模型,而不是因为FactoryBot。假设你有一个带有关联b、c和d的工厂a。为了创建模型,你需要所有的关联,因为你有非空依赖项,在工厂文件中你可以添加以下内容:
FactoryBot.define do
factory :a do
b { build :b }
c { build :c }
d { build :d }
end
end
Build允许您在内存数据库而不是测试数据库中保持关联,但是,如果您在代码中对该关联进行特定调用,并且需要数据库调用,例如a.b.update!(some_column: value)
,则需要在测试中通过像create :a, b: create(:b)
那样创建它来覆盖它。
人们通常每次都创建模型,而不是使用let
,后者只在需要时创建对象,而不是在before :each
中创建对象。