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 つの例は失敗します。
誰かが私が間違っていることを知っていますか?
注: アプリケーション コード全体は、ここにあります。