我有两个型号,
Branch
和Organization
。一个组织有很多分支机构。一个分支机构不能没有关联的组织而存在,而一个组织也不能没有至少一个分支机构而存在。在组织模型中,我们有以下内容:
after_create :create_branch_if_not_exists!
...
def create_branch_if_not_exists!
return unless branches.empty?
branch = Branch.new(attrs: some_attrs)
branches << branch
end
事实证明这是测试时的问题,因为在创建分支时,我们实际上创建了两个。使用 FactoryBot:
FactoryBot.define do
factory :branch do
organization
...
end
end
# in test
create(:branch) # this creates two branches.
在创建分支之前,我猜组织已经创建了?它的
after_create
方法不知道即将创建的分支,因此它会先创建一个分支。
有很多测试,总是先创建组织会带来很多变化。
有简单的解决方法吗?或者我只是构建了糟糕的代码还是什么?
尝试更改为
after_commit
但还是一样。
听起来代码和测试逻辑是矛盾的。测试应该依赖于代码行为。
当需要创建分支时,实际代码会做什么?可能与测试相同,也会创建一个组织和另一个分支。这是一个有效的场景吗?
无论如何,如果您确定业务逻辑,您可以尝试在测试中跳过
after_create
回调,如此处所述:
Organization.skip_callback(:create, :after, :create_branch_if_not_exists!)
使用完毕后,您可以设置回调:
Organization.set_callback(:create, :after, :create_branch_if_not_exists!)