2017-02-14 34 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