最后我决定把
FactoryBot.create
功能分为两步:
FactoryBot.build
和
.save
函数在获取的对象上运行。它允许我移动
let!
调用main作用域和define方法,在需要的情况下,该方法会准确地保存构建的对象。我的干代码现在看起来是这样的:
describe "POST create" do
let!(:service_attributes_with_categories_1_and_2) {
FactoryBot.attributes_for :service_with_categories_1_and_2
}
let!(:category_1) { FactoryBot.build :category, {id: 1} }
let!(:category_2) { FactoryBot.build :category, {id: 2} }
def save_categories_1_and_2
category_1.save
category_2.save
end
describe "if we have a logged in user and he can be an owner" do
describe "and if params are valid" do
before(:each) do
save_categories_1_and_2
end
it "creates a new service" do
# ...
end
it "creates associations with categories" do
# ...
end
end
describe "and if categories are not valid" do
# ...
end
describe "and if some common service params are not valid" do
# ...
end
end
describe "if no user is logged in, but params are valid" do
before(:each) do
save_categories_1_and_2
end
it "doesn't create a new service" do
# ...
end
it "doesn't create associations with categories" do
# ...
end
end
describe "if logged user cannot be an owner, but params are valid" do
before(:each) do
save_categories_1_and_2
end
it "doesn't create a new service" do
# ...
end
it "doesn't create associations with categories" do
# ...
end
end
end
非常感谢@midlins和@Taryn East为我指明了正确的方向@Taryn East-您建议的调整也适用于此处描述的情况,但在我的应用程序中,我还有更高级的情况,这还不够。我认为这里提出的解决方案更具普遍性。