1

アパートメント ジェムを使用して、マルチテナントの 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

ご覧のとおり、テストのセットアップには 2 つのアプローチがあります。1 つはaround()フックを使用し、もう 1 つは同じことを行いますが、独立してbefore()after()フックを使用します。

どちらのアプローチも同等であり、交換可能であると思います。しかし、驚くべきことに、実際に機能するのはオプション 2 だけです。

この動作には理由がありますか? ブロックはaround()ブロックとは異なる順序で実行されbefore()ますか?

4

1 に答える 1