Тестирование материализованного представления в 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

документация о use_transactional_fixtures

Другие вопросы по тегам