Отказ от ответственности: Я очень новичок в RSpec и TDD в целом, поэтому я, возможно, полностью об этом поменяю.RSpec any_instance stubbing на объекте, инициализированном функцией
Я хочу написать интерфейс командной строки для моей программы, которая принимает команду и генерирует класс для ее обработки. Способ, которым программа предназначена для работы, похожа на такие инструменты, как git и svn; то есть вы можете передать «srs init» для инициализации программы, «srs add», чтобы добавить что-то к ней, и так далее.
Так у меня есть класс, который принимает ARGV и передает его на конкретный обработчик, который выглядит следующим образом:
обработчикclass CLI
def run!(*arguments)
command = arguments.shift
case command
when "init"
CLI::Init.new.run!(*arguments)
end
end
end
My Init будет выглядеть следующим образом:
class CLI
class Init
def initialize()
end
def run!(*arguments)
end
end
end
I Я пытаюсь написать набор тестов для функции маршрутизации класса CLI. RSpec терпит неудачу, если я использую следующее:
describe CLI do
it "should launch the Init handler if we pass init" do
CLI::Init.any_instance.should_receive(:run!)
CLI::run!(*["init"])
end
end
Однако она проходит, если я заменить вызов CLI::run!
с помощью прямого вызова запускается обработчик INIT в; i.e.:-
describe CLI do
it "should launch the Init handler if we pass init" do
CLI::Init.any_instance.should_receive(:run!)
CLI::Init.new.run!(*[])
end
end
Это выглядит так, как будто any_instance работает только на определенных случаях/возводимые в describe
блоке, но я не совсем уверен. Если кто-нибудь может предложить мне какое-либо руководство либо о том, как я могу проверить, что метод класса был вызван на экземпляр, построенный внутри моей функции run!
, или, пожалуй, лучший способ проверить эту функциональность, я был бы очень благодарен.
Как это происходит? Можете ли вы показать след? На первый взгляд ваш код выглядит нормально. – x1a4
@ x1a4, еще раз посмотрел ваш комментарий, и вы правы! Я упростил код для этого сообщения, и упрощенный код работает нормально .. должен был протестировать его так же, как и до публикации. Выложите ответ, объяснив, в чем проблема, как только мой восьмичасовой лимит истек. – danielpwright