Domanda

Come scrivo i test per i progetti che utilizzano Esta_Connection nel modello per connettersi a un altro database?

È stato utile?

Soluzione

Quando si stabilisce Esta_connection per alcuni modelli per connettersi a un database diverso, uno dei problemi che si incontrerebbero durante il test di quelle tabelle è che i dati di test creati non verranno ripristinati automaticamente.

Il codice effettivo per creare un punto di salvataggio della transazione e ripristinare i dati per la durata del test in rails / activerecord / lib / active_record / fixtures.rb . E in particolare ci sono due metodi setup_fixtures e teardown_fixtures . Il codice in questi metodi è semplice. Creano solo un punto di salvataggio e eseguono il rollback per ogni test. Ma lo fa solo per la connessione ActiveRecord :: Base .

Quindi quello che devi fare è "quotazione della scimmia" questi metodi in modo che, oltre alla connessione ActiveRecord :: Base , venga eseguita la stessa serie di operazioni per la connessione al database aggiuntiva.

Ecco un codice di esempio per lo stesso:

## database.yml
development:
  database: dev
test:
  database: test
#...
my_connection_development:
  database: my_connection_dev
my_connection_test:
  database: my_connection_test
#...

## my_connection_base.rb
class MyConnectionBase < ActiveRecord::Base
  establish_connection(ActiveRecord::Base.configurations["my_connection_#{RAILS_ENV}"])
  self.abstract_class = true
end

## my_model.rb
class MyModel < MyConnectionBase
end

## my_another_model.rb
class MyAnotherModel < MyConnectionBase
end

## test_case_patch.rb
module ActiveSupport
  class TestCase
    def setup_fixtures
      return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
      if pre_loaded_fixtures && !use_transactional_fixtures
        raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
      end
      @fixture_cache = {}
      @@already_loaded_fixtures ||= {}
      # Load fixtures once and begin transaction.
      if run_in_transaction?
        if @@already_loaded_fixtures[self.class]
          @loaded_fixtures = @@already_loaded_fixtures[self.class]
        else
          load_fixtures
          @@already_loaded_fixtures[self.class] = @loaded_fixtures
        end

        ActiveRecord::Base.connection.increment_open_transactions
        ActiveRecord::Base.connection.transaction_joinable = false
        ActiveRecord::Base.connection.begin_db_transaction

        MyConnectionBase.connection.increment_open_transactions
        MyConnectionBase.connection.transaction_joinable = false
        MyConnectionBase.connection.begin_db_transaction
      # Load fixtures for every test.
      else
        Fixtures.reset_cache
        @@already_loaded_fixtures[self.class] = nil
        load_fixtures
      end
      # Instantiate fixtures for every test if requested.
      instantiate_fixtures if use_instantiated_fixtures
    end

    def teardown_fixtures
      return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
      unless run_in_transaction?
        Fixtures.reset_cache
      end
      # Rollback changes if a transaction is active.
      if run_in_transaction? && MyConnectionBase.connection.open_transactions != 0
        MyConnectionBase.connection.rollback_db_transaction
        MyConnectionBase.connection.decrement_open_transactions
      end
      # Rollback changes if a transaction is active.
      if run_in_transaction? && ActiveRecord::Base.connection.open_transactions != 0
        ActiveRecord::Base.connection.rollback_db_transaction
        ActiveRecord::Base.connection.decrement_open_transactions
      end
      MyConnectionBase.clear_active_connections!
      ActiveRecord::Base.clear_active_connections!
    end
  end
end

Altri suggerimenti

Non vedo la necessità di modificare i codici di test dopo aver inserito Esta_connection nel modello poiché si verifica ancora la stessa funzionalità del modello.

Non sarà necessario testare il metodo Esta_connection, in quanto è un metodo activrecord ed è ben testato, prima del rilascio.

anche se se vuoi ancora farlo, chiama il metodo con un metodo diverso e vedi se riesci a connetterti alle tabelle appropriate in quel DB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top