тестирование и establish_connection

Можно использовать полный datetime переменные с timedelta, и путем обеспечения фиктивной даты затем с помощью time, чтобы просто получить временную стоимость.

, Например:

import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()

результаты в двух значениях, на расстоянии в три секунды:

11:34:59
11:35:02

Вы могли также выбрать более читаемое

b = a + datetime.timedelta(seconds=3)

, если Вы так склонны.

<час>

, Если Вы после функции, которая может сделать это, можно изучить использование addSecs ниже:

import datetime

def addSecs(tm, secs):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(seconds=secs)
    return fulldate.time()

a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b

Это производит:

 09:11:55.775695
 09:16:55
5
задан Nakilon 30 April 2016 в 13:18
поделиться

3 ответа

Когда вы устанавливаете соединение для определенных моделей для подключения к другой базе данных, одна Проблема, с которой вы столкнетесь при тестировании этих таблиц, заключается в том, что созданные вами тестовые данные не будут автоматически откатываться.

Фактический код для создания точки сохранения транзакции и отката данных для тестовых жизней находится в rails / activerecord /lib/active_record/fixtures.rb . И особенно есть два метода setup_fixtures и teardown_fixtures . Код в этих методах прост. Они просто создают точку сохранения и делают откат для каждого теста. Но это касается только ActiveRecord :: Базовое соединение.

Итак, что вам нужно сделать, так это "обезьяно исправить" эти методы, чтобы, помимо соединения ActiveRecord :: Base , тот же набор операций выполнялся для вашего дополнительного соединения с базой данных.

Вот пример кода для того же:

## 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
10
ответ дан 14 December 2019 в 04:40
поделиться

Я не вижу необходимости изменять тестовые коды после того, как вы поместите install_connection в свою модель, поскольку вы по-прежнему тестируете ту же функциональность модели.

0
ответ дан 14 December 2019 в 04:40
поделиться

You will not need to Test the establish_connection method, as its a activrecord method and is well tested, before release.

although if you still want to do so, call the method within a different method, and see if you can connect to appropriate tables in that DB.

-2
ответ дан 14 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: