Я использую RSpec и хочу протестировать конструктора Singleton-класса больше чем в один раз.
Как я могу сделать это?
Наилучшие пожелания
посмотрите http://blog.ardes.com/2006/12/11/testing-singletons- with-ruby :
require 'singleton'
class <<Singleton
def included_with_reset(klass)
included_without_reset(klass)
class <<klass
def reset_instance
Singleton.send :__init__, self
self
end
end
end
alias_method :included_without_reset, :included
alias_method :included, :included_with_reset
end
Вы можете просто создать новый это
и блок для каждой спецификации. Разбейте свою спецификацию на тестируемую единицу. Используйте «до» и «после», чтобы настроить и очистить все, что вы сделали.
before (: each)
и after (: each)
выполняются для каждого it
блок.
Реорганизуйте его в класс, который можно создавать несколько раз. У этого есть побочный эффект (некоторые сказали бы, выгода), заключающийся в удалении природы Singleton из класса.
Посмотрите на это с другой стороны: вы обнаружили необходимость вызывать конструктор более одного раза. Почему должен класс создавать только один экземпляр? Какие преимущества дает синглтон?
Позволяет ли RSpec выполнять действия перед тестированием? Итак, вы можете добавить еще один метод к своему статическому классу, который очищает все, что было сделано во время конструктора. Затем просто вызывайте это перед каждым тестом.
Одна из причин, по которой люди используют синглоны, потому что "глобальные переменные - это плохо, м'кей"? Одиночка - это глобальная переменная, секвестрируемая в пространстве имен, с ленивой конкретизацией. Подумайте, может ли истинная глобальная переменная упростить вещи, особенно если вам не нужны ленивые инстанцирования
.