Spec-Zone.ru › Ruby on Rails 8.1

module ActiveSupport::Testing::ConstantStubbing

Открытые методы экземпляра

stub_const (mod, constant, new_value, exists: true) { || ... } Показать исходный код
# File activesupport/lib/active_support/testing/constant_stubbing.rb, line 28
def stub_const(mod, constant, new_value, exists: true)
  if exists
    begin
      old_value = mod.const_get(constant, false)
      mod.send(:remove_const, constant)
      mod.const_set(constant, new_value)
      yield
    ensure
      mod.send(:remove_const, constant)
      mod.const_set(constant, old_value)
    end
  else
    if mod.const_defined?(constant)
      raise NameError, "already defined constant #{constant} in #{mod.name}"
    end

    begin
      mod.const_set(constant, new_value)
      yield
    ensure
      mod.send(:remove_const, constant)
    end
  end
end

Изменяет значение константы на время выполнения блока. Пример:

# World::List::Import::LARGE_IMPORT_THRESHOLD = 5000
stub_const(World::List::Import, :LARGE_IMPORT_THRESHOLD, 1) do
  assert_equal 1, World::List::Import::LARGE_IMPORT_THRESHOLD
end

assert_equal 5000, World::List::Import::LARGE_IMPORT_THRESHOLD

Использование этого метода вместо принудительного World::List::Import::LARGE_IMPORT_THRESHOLD = 5000 предотвращает появление предупреждений и гарантирует, что после завершения теста будет возвращено прежнее значение.

Если константа ещё не существует, но вам нужно задать её на время выполнения блока, передайте ‘exists: false`.

stub_const(object, :SOME_CONST, 1, exists: false) do
  assert_equal 1, SOME_CONST
end

Примечание: заглушка для константы действует во всех потоках. Поэтому, если у вас есть параллельные потоки (например, отдельные наборы тестов, выполняющиеся параллельно), которые зависят от одной и той же константы, разные заглушки могут перезаписать друг друга.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API