модуль ActiveSupport::Testing::ConstantStubbing
Публичные методы экземпляров
# 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.