2012-05-07 2 views
1

Отказ от ответственности: Я очень новичок в 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!, или, пожалуй, лучший способ проверить эту функциональность, я был бы очень благодарен.

+0

Как это происходит? Можете ли вы показать след? На первый взгляд ваш код выглядит нормально. – x1a4

+1

@ x1a4, еще раз посмотрел ваш комментарий, и вы правы! Я упростил код для этого сообщения, и упрощенный код работает нормально .. должен был протестировать его так же, как и до публикации. Выложите ответ, объяснив, в чем проблема, как только мой восьмичасовой лимит истек. – danielpwright

ответ

0

Иногда объяснение проблемы раскрывает ответ. На самом деле, имя обработчика, «Init» был быть передан в качестве параметра к describe блока, больше, как это:

%w{Init}.each do |cmd| 
    describe CLI do 
     it "should launch the #{cmd} handler if we pass #{cmd}" do 
      CLI.const_get(cmd).any_instance.should_receive(:run!) 
      CLI::run!(*[cmd]) 
     end 
    end 
end 

Описывая проблему, я вынул петлю, чтобы упростить этот вопрос, но при этом произошло ключевое изменение - название класса Init начиналось с капитала «I», а имя команды, переданной в командную строку, init, начинается с небольшого «i».

Итак, оказалось, что тест завершился неудачно, потому что я попытался передать команду «Init», когда мне нужно было передать команду «init».

TL; DR - исходный код . на самом деле произведение! Извините за беспокойство.

Смежные вопросы