【问题标题】:post to a different controller in an rspec test在 rspec 测试中发布到不同的控制器
【发布时间】:2011-09-02 23:06:36
【问题描述】:

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

示例: 在 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:我不想设置黄瓜

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    控制器规范是 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 了解更多信息。

    【讨论】:

      【解决方案2】:

      有一种方法是在调用测试方法之前分配@controller 的值。示例

      def setup
      
        @controller = UserController.New
      
        do user stuff
      
        @controller = ThisController.New
      
        do test intented for this controller
      end
      

      【讨论】:

      • 我想检查它在哪个控制器上,这有点帮助。
      【解决方案3】:

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

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

      def setup
        old_controller = @controller
        @controller = UserController.new
      
        # do user stuff
      
        @controller = old_controller
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多