1

Apartment gem をミドルウェアとして使用して、この Rails 3.2 アプリケーションを開発しています。アプリケーション自体は完全に機能し、すべての RSpec の例も個別に実行すると完全に機能します。ただし、コマンドを使用してすべてのテストを同時に実行するとbundle exec rspec、2 つの異なるコントローラー仕様で失敗する 2 つの例があり、それらはまったく同じことを行います。問題の 2 つの例を次に示します。

issues_controller_spec.rbファイル内:

describe "GET 'new'" do

  # ...

  context "for authenticated users" do
    before(:each) do
      controller.log_in(create(:user))
      get :new
    end

    # ...

    it "should create a new issue instance and put it in an instance variable" do
      assigns(:issue).should be_an_instance_of Issue
    end
  end
end

users_controller_spec.rbファイル内:

describe "GET 'new'" do

    # ...

  context "for authenticated users" do

      # ...

    context "for admin users" do
      before(:each) do
        admin = create(:admin)
        admin.add_role :admin
        controller.log_in(admin)
        get :new
      end

      # ...

      it "should create a new User instance and put it in an instance variable" do
        assigns(:user).should be_an_instance_of User
      end
    end
  end
end

次の 2 つの例は、before フックの影響を受けます。

before(:each) do
  client = create(:client)
  @request.host = "#{client.account_name}.lvh.me"
end

新しいクライアントを作成するとき、after_createコールバックがあります:

# Create the client database (Apartment) for multi-tenancy
def create_client_database
  begin
    Apartment::Database.create(self.account_name)
  rescue Apartment::SchemaExists
    return
  rescue
    self.destroy
  end
end

そして、例が失敗する場所があります。begin...rescue...endブロックを削除して行Apartment::Database.create(self.account_name)を保持すると、失敗した例で次の例外が発生します。

ActiveRecord::StatementInvalid:
   PG::Error: ERROR:  current transaction is aborted, commands ignored until end of transaction block
   : SET search_path TO public

繰り返しますが、例を個別に実行すると成功しますが、すべての例を実行すると、上記の 2 つの例は失敗します。

誰かが私が間違っていることを知っていますか?

: アプリケーション コード全体は、ここにあります。

4

1 に答える 1

0

client = create(:client)次のように行をbegin, rescue,endブロックで囲むことで、この問題を解決しました。

before(:each) do
  begin
    client = create(:client)
  rescue
    client = Client.create!(attributes_for(:client))
  end

  @request.host = "#{client.account_name}.lvh.me"
end

これがどのように、またはなぜ機能するのかはわかりませんが、機能することはわかっています。

于 2012-07-30T23:11:38.917 に答える