2017-02-14 2 views
1

die Scenic gem Verwendung Ich habe ein Modell gebaut Active durch eine materialisierte Ansicht gesichertTesting materialisierten Ansicht in 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 

ich jetzt versuchen, dieses Modell in RSpec zu testen, aber egal was ich tue, ich kann‘ t erhalten Postgres die Ansicht mit Datensätzen zu füllen:

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

Wie kann ich die materialisierte Ansicht mit Aufzeichnungen für die Prüfung zu füllen?

+1

Wie ist ': sale_item' zu' MatviewSales' verwandt? Können Sie das Schema für diese 2 Tabellen und den Code für die Factory ': sale_item' anzeigen? – Midwire

+0

Vereinbaren Sie mit @ Midwire. Wir müssten die Schemas, die Abfrage für die materialisierte Ansicht sowie die Zeile sehen, die beim Aufruf der Factory erstellt wird. Versuchen Sie außerdem, bei der Aktualisierung "gleichzeitig" auf "falsch" zu setzen. –

Antwort

1

Beim Aktualisieren der materialisierten Ansicht werden noch nicht festgeschriebene Transaktionen nicht berücksichtigt.

Wenn Sie rspec use_transactional_fixtures oder DatabaseCleaner.strategy = :transaction verwenden, bedeutet dies, dass Ihre Ansichten keine vorherigen FactoryGirl.create Datensätze sehen.

Die Lösung, die ich verwende, ist es, Transaktionen für bestimmte Tests zu deaktivieren, die materialisierte Ansichten verwenden.

# 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

Verwandte Themen