4

使用Scenic gem,我构建了一个由物化视图支持的 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 []> 

如何使用记录填充物化视图以进行测试?

4

1 回答 1

5

刷新物化视图不会考虑任何尚未提交的事务。

使用 rspecuse_transactional_fixturesDatabaseCleaner.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 的文档

于 2017-03-28T11:01:42.137 回答