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

djb*_*ick 23 rspec ruby-on-rails

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

示例:在u​​ser_controller_spec.rb中

  it "should just post to users" do        
    post :create, @params    # this goes to the users controller
  end
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

  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
Run Code Online (Sandbox Code Playgroud)

ps:我不想设置黄瓜

Dav*_*sky 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.


小智 6

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

def setup

  @controller = UserController.New

  do user stuff

  @controller = ThisController.New

  do test intented for this controller
end
Run Code Online (Sandbox Code Playgroud)


Tom*_*zar 5

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

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

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

  # do user stuff

  @controller = old_controller
end
Run Code Online (Sandbox Code Playgroud)