1

アパートを使い始めたばかりで、共有シークレットで機能するエレベーターを開発したいと考えています。しかし、私の最初のテストは有望ではありませんでした。

私が今いるところは、次のことです。

app/middleware/static_elevator.rb

require 'apartment/elevators/generic'

class StaticElevator < Apartment::Elevators::Generic

  # @return {String} - The tenant to switch to
  def parse_tenant_name(request)
    # request is an instance of Rack::Request

    'my_schema_name'
  end
end

と:

config/initializers/apartment.rb

require 'apartment/elevators/generic'
# require 'apartment/elevators/domain'
#require 'apartment/elevators/subdomain'    
#
# Apartment Configuration
#
Apartment.configure do |config|

  config.tenant_names = lambda { Account.pluck(:schema) }

end

Rails.application.config.middleware.use 'StaticElevator'

つまり、データベースにリクエストが来るたびに、スキーマとして my_schema_name が使用されます。私のコントローラーには次のものがあります:

class V1::StaffController < ApplicationController
  def index
    @staff = Staff.only_employees
  end
end

そして私のテストは次のとおりです。

require 'rails_helper'

RSpec.describe V1::StaffController, type: :controller do
  context 'no query string' do
    subject { get :index }

    it 'gets only the employees' do
      expect(Staff).to receive(:only_employees).and_return([])
      subject
    end
  end
end

テストを実行すると、次のようになります。

Randomized with seed 63457

V1::StaffController
  no query string
    gets only the employees (FAILED - 1)

Failures:

  1) V1::StaffController no query string gets only the employees
     Failure/Error: expect(Staff).to receive(:only_employees).and_return([])

     ActiveRecord::StatementInvalid:
       PG::UndefinedTable: ERROR:  relation "users" does not exist
       LINE 5:                WHERE a.attrelid = '"users"'::regclass
                                                 ^
       :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                            pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                       FROM pg_attribute a LEFT JOIN pg_attrdef d
                         ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                      WHERE a.attrelid = '"users"'::regclass
                        AND a.attnum > 0 AND NOT a.attisdropped
                      ORDER BY a.attnum
     # ./spec/controllers/v1/staff_controller_spec.rb:8:in `block (3 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # PG::UndefinedTable:
     #   ERROR:  relation "users" does not exist
     #   LINE 5:                WHERE a.attrelid = '"users"'::regclass
     #                                             ^
     #   ./spec/controllers/v1/staff_controller_spec.rb:8:in `block (3 levels) in <top (required)>'

Top 1 slowest examples (0.01605 seconds, 94.7% of total time):
  V1::StaffController no query string gets only the employees
    0.01605 seconds ./spec/controllers/v1/staff_controller_spec.rb:7

Finished in 0.01694 seconds (files took 4.37 seconds to load)
1 example, 1 failure

これは、スキーマが実行されていないことを示しています。私は正しいですか?もしそうなら、私は何を間違っていますか?

4

2 に答える 2

1

テスト データベースがまだ適切に移行されていないようです。

走った後どうなるか

bundle exec rake db:migrate RAILS_ENV=test

また、あなたの例では、parse_tenant_name に静的な文字列だけを返しています。たとえば、テナント名を request.session[:key] に保存する場合など、これは動的にする必要があります。

このテナント名は、構成に従って Account.pluck(:schema) にも存在する必要があります。

于 2015-12-17T10:30:19.920 に答える
0

そのため、データベースにスキーマが既にある場合でも、rspec を操作するには schema.rb が必要なようです。db/schema.rb を提供すると、突然、すべてが正常に動作し、アパートメント (および付随するテスト) が期待どおりに実行されました。

あなたは少なくとも部分的にこれをオペレーターの過信にまでチョークすることができます:)

于 2015-12-18T03:50:20.627 に答える