Тестирование материализованного представления в Rspec
Используя камень Scenic, я построил модель activerecord, подкрепленную материализованным представлением
class MatviewSales < ActiveRecord::Base
self.table_name = 'matview_sales'
self.primary_key = :id
belongs_to :user
belongs_to :account
belongs_to :account_manager, class_name: User, foreign_key: 'manager_id'
def self.refresh
Scenic.database.refresh_materialized_view(table_name, concurrently: true)
end
end
Сейчас я пытаюсь протестировать эту модель в RSpec, но независимо от того, что я делаю, я не могу заставить Postgres заполнить представление записями:
> FactoryGirl.create(:sale_item)
> MatviewSales.refresh
> MatviewSales.all
=> #<ActiveRecord::Relation []>
Как заполнить материализованное представление записями для тестирования?
1 ответ
Обновление материализованного представления не будет учитывать все еще не совершенные транзакции.
Когда использовать rspec use_transactional_fixtures
или же DatabaseCleaner.strategy = :transaction
это означает, что ваши взгляды не увидят FactoryGirl.create
записей.
Решение, которое я использую, заключается в отключении транзакций для конкретных тестов, которые используют материализованные представления.
# spec_helper.rb
RSpec.configure do |config|
config.use_transactional_fixtures = false
# ... other configurations
config.around(:each) do |example|
DatabaseCleaner.strategy = example.metadata.fetch(:clean_database_with, :transaction)
DatabaseCleaner.start
example.run
DatabaseCleaner.clean
end
end
# your test
describe MatviewSales, clean_database_with: :truncation do
it 'works :)' do
FactoryGirl.create(:sale_item)
MatviewSales.refresh
expect(MatviewSales.count).to eq 1
end
end