тестовые контроллеры рельсов, которых нет в спецификации/контроллеры с rspec 2

rspec ожидает, что спецификации вашего контроллера будут в /spec/controllers. У меня есть несколько модулей, которые включены в мои контроллеры. Единственный способ протестировать их, насколько я могу судить, — это создать фиктивный контроллер, включить в него модуль и протестировать оттуда. Проблема в том, что спецификации модуля находятся в /spec/lib/module, поэтому ControllerExampleGroup не включен, что означает, что я не могу вызывать вспомогательные методы get «action» и т. д.

Я могу вручную импортировать их, что помогает мне в большинстве случаев, но затем я получаю эту ошибку:

 Failure/Error: Unable to find matching
 line from backtrace undefined method
 `path_set' for nil:NilClass
  activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in
 `method_missing'
  rspec-rails-2.2.1/lib/rspec/rails/view_rendering.rb:68
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:291:in
 `instance_eval'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:291:in
 `instance_eval_with_rescue'
  rspec-core-2.2.1/lib/rspec/core/hooks.rb:39:in
 `run_in'
  rspec-core-2.2.1/lib/rspec/core/hooks.rb:70:in
 `run_all'
  rspec-core-2.2.1/lib/rspec/core/hooks.rb:70:in
 `each'
  rspec-core-2.2.1/lib/rspec/core/hooks.rb:70:in
 `run_all'
  rspec-core-2.2.1/lib/rspec/core/hooks.rb:106:in
 `run_hook'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:194:in
 `eval_after_eachs'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:194:in
 `each'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:194:in
 `eval_after_eachs'
  rspec-core-2.2.1/lib/rspec/core/example.rb:130:in `run_after_each'
  rspec-core-2.2.1/lib/rspec/core/example.rb:44:in `run'
  rspec-core-2.2.1/lib/rspec/core/example.rb:88:in `with_around_hooks'
  rspec-core-2.2.1/lib/rspec/core/example.rb:37:in `run'
  rspec-core-2.2.1/lib/rspec/core/example.rb:81:in `with_pending_capture'
  rspec-core-2.2.1/lib/rspec/core/example.rb:80:in `catch'
  rspec-core-2.2.1/lib/rspec/core/example.rb:80:in `with_pending_capture'
  rspec-core-2.2.1/lib/rspec/core/example.rb:36:in `run'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:261:in
 `run_examples'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:257:in
 `map'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:257:in
 `run_examples'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:231:in
 `run'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:232:in
 `run'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:232:in
 `map'
  rspec-core-2.2.1/lib/rspec/core/example_group.rb:232:in
 `run'
  rspec-core-2.2.1/lib/rspec/core/command_line.rb:27:in
 `run'
  rspec-core-2.2.1/lib/rspec/core/command_line.rb:27:in
 `map'
  rspec-core-2.2.1/lib/rspec/core/command_line.rb:27:in
 `run'
  rspec-core-2.2.1/lib/rspec/core/reporter.rb:12:in `report'
  rspec-core-2.2.1/lib/rspec/core/command_line.rb:24:in
 `run'
  rspec-core-2.2.1/lib/rspec/core/runner.rb:55:in
 `run_in_process'
  rspec-core-2.2.1/lib/rspec/core/runner.rb:46:in
 `run'
  rspec-core-2.2.1/lib/rspec/core/runner.rb:10:in
 `autorun'
  /Users/jeffdeville/.rvm/gems/ree-1.8.7-2010.02/bin/rspec:19

Предложения?


person Jeff D    schedule 03.12.2010    source источник
comment
Похоже, импорт вручную тоже не работает, я получаю:   -  person Jeff D    schedule 03.12.2010


Ответы (1)


Если у вас есть спецификация, которой нет в одном из стандартных расположений, вы всегда можете сообщить об этом rspec, передав атрибут :type методу description:

describe MyController, :type => :controller do
    ...
end

Для указания модулей, которые должны быть включены контроллером, в rspec 2 есть очень удобный способ создания анонимных контроллеров.

describe MyModule do

    context "when included by a controller", :type => :controller do
        controller do      # anonymous subclass of ActionController::Base
            include MyModule

            def index
                head :ok
            end
        end

        it "works" do
          get "index"
          response.should be_success
        end
    end
end

Дополнительная информация здесь, в документации rspec (создана на основе функций Cucumber): http://relishapp.com/rspec/rspec-rails/dir/controller-specs/anonymous-controller

person Rob Davis    schedule 10.05.2011
comment
Отличный пример того, как тестировать поведение контроллера, указанное в библиотечных модулях! - person Filip Dupanović; 28.08.2012