2015-12-17 2 views
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 

Который говорит мне схема не работает , Я прав? Если да, то что я делаю неправильно?

ответ

0

Так что кажется, что даже если у вас есть схема в базе данных, вам понадобится schema.rb для rspec для работы. Как только я предоставил db/schema.rb, внезапно все было хорошо с миром, и apartmant (и его сопутствующие тесты) бежал, как ожидалось.

Вы можете, по крайней мере, частично отнести это до чрезмерной самоуверенности оператора :)

1

Похоже, что ваш тестовый db еще не перенесен.

Что происходит после того, как вы запустите

bundle exec rake db:migrate RAILS_ENV=test 

также: В вашем примере вы возвращаете только статическую строку в parse_tenant_name, это должно быть динамичным, например, когда вы сохраняете имя арендатора в request.session [: ключ].

Это имя арендатора должно также присутствовать в Account.pluck (: schema) в соответствии с вашей конфигурацией.

+0

Спасибо за ответ. Как оказалось, приложение полагается на уже существующую унаследованную схему, поэтому я не выполняю миграции как таковой. – robertpostill

+0

Вы также правы, что я должен поместить что-то динамическое в parse_tenant_name, но я решил, что начну с получения статического значения, а затем добавлю динамическое поведение, когда у меня будет статическая работа. Поэтому да, я могу получить арендатора из таблицы учета, когда я получу эту работу. – robertpostill