2010-12-03 62 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