我正在使用公寓 gem来管理多租户 Rails 应用程序。
旁注:如果您不熟悉 gem,切换公寓只是切换 Postgres DB 后端使用的模式。你改变公寓租户Apartment::Tenant.switch!(apartment)
我有几个测试在某个公寓租户的背景下测试行为。为此,我使用以下设置(为控制器规格显示的示例)
RSpec.describe MyController, type: :controller do
before(:each) do
# Some global before() setup
end
context "foo apartment" do
### Option 1 - Using the around() hook
around(:each) do |example|
begin
Apartment::Tenant.switch!("foo")
example.run
ensure
Apartment::Tenant.switch!("public")
end
end
### Option 2 - Independent before() + after() hooks
before(:each) { Apartment::Tenant.switch!("foo") }
after(:each) { Apartment::Tenant.switch!("public") }
it "tests that the foo apartment is being used" do
expect(Apartment::Tenant.current).to eq("foo")
end
end
end
如您所见,有两种设置测试的方法。一个使用around()
钩子,另一个做同样的事情,但独立使用before()
andafter()
钩子。
我想这两种方法是等效的并且可以互换的。但令人惊讶的是,只有选项 2 真正有效。
这种行为有原因吗?块是否以与around()
块不同的顺序运行before()
?