在rspec测试中发布到不同的控制器

时间:2011-09-02 23:06:37

标签: ruby-on-rails rspec

如何发布到与测试脚本当前指向的控制器不同的控制器?

实施例: 在user_controller_spec.rb

  it "should just post to users" do        
    post :create, @params    # this goes to the users controller
  end

我想做类似的事情:

  it "should post to user and people to do some integration testing" do        
    post :create, @params    # this goes to the users controller still
    post 'people', :create, @params   # this goes to the people controller
  end

ps:我不想设置黄瓜

3 个答案:

答案 0 :(得分:28)

控制器规范是Rails功能测试的包装器,它不支持多个请求或控制器。你想要的是RSpec请求规范(rails 3)或集成规范(rails 2)。这些包装Rails集成测试,它确实支持多个控制器的多个请求(甚至多个会话),但它们与控制器规范的工作方式略有不同。你必须使用完整路径(所以获取new_thing_path),并且你不能在控制器上存根任何东西(因为在你提出请求之前没有控制器)。

有关详细信息,请参阅http://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spechttp://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html

答案 1 :(得分:5)

如果在调用测试方法之前分配@controller的值,有一种方法。实施例

def setup

  @controller = UserController.New

  do user stuff

  @controller = ThisController.New

  do test intented for this controller
end

答案 2 :(得分:2)

基于其他答案,但更安全。

存储当前控制器实例,并使用所需控制器创建一个新实例。最后,用旧的存储实例替换新的控制器实例。

def setup
  old_controller = @controller
  @controller = UserController.new

  # do user stuff

  @controller = old_controller
end