2010-12-03 60 views
2

rspec預計您的控制器規格在/ spec/controllers中。我有一些模塊包含在我的控制器中。據我所知,測試它們的唯一方法是創建一個虛擬控制器,將模塊包含在其中,並從那裏進行測試。問題在於模塊規格在/ spec/lib/module中,所以ControllerExampleGroup不包含在內,這意味着我無法調用幫助器方法獲取「動作」等。不在spec/controllers中的rspec 2的測試軌控制器

我可以手動導入這些我得到了大部分的路,但我然後得到這個錯誤:

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 

建議?類型屬性的描述方法:

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

對於間距標準即意味着要包含的模塊

+0

貌似手動導入不完全奏效,我越來越:如何測試控制器行爲 – 2010-12-03 20:05:14

回答

8

如果你有一個規範,這不是標準的地區之一,你可以隨時通過傳遞告訴rspec的通過控制器,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的文檔(黃瓜功能生成):http://relishapp.com/rspec/rspec-rails/dir/controller-specs/anonymous-controller

+0

很好的例子在庫模塊中指定! – 2012-08-28 17:30:09