2017-02-14 39 views
1

使用Scenic gem我已经建立了一个物化视图测试物化视图中Rspec的

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的这种模式,但无论我做什么,我不能支持ActiveRecord模型t让Postgres填充记录的视图:

> FactoryGirl.create(:sale_item) 
> MatviewSales.refresh 
> MatviewSales.all 
=> #<ActiveRecord::Relation []> 

如何用测试记录填充物化视图?

+1

如何为':sale_item'有关'MatviewSales'?你可以显示这两个表的模式和':sale_item'工厂的代码吗? – Midwire

+0

同意@Midwire。我们需要查看模式,查询物化视图以及调用工厂时创建的行。另外,在刷新时尝试将'concurrently'设置为'false'? –

回答

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