【问题标题】:Testing Materialized View in Rspec在 Rspec 中测试物化视图
【发布时间】:2017-07-02 23:43:24
【问题描述】:

使用Scenic gem,我构建了一个由物化视图支持的活动记录模型

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 []> 

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

【问题讨论】:

  • :sale_itemMatviewSales 有什么关系?您能否显示这 2 个表的架构和 :sale_item 工厂的代码?
  • 同意@Midwire。我们需要查看模式、物化视图的查询以及调用工厂时创建的行。此外,尝试在刷新中将concurrently 设置为false

标签: ruby-on-rails postgresql rspec materialized-views scenic


【解决方案1】:

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

当使用 rspec use_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

documentation about use_transactional_fixtures

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多