【问题标题】:Does a get request call actually run the controller action?获取请求调用是否实际运行控制器操作?
【发布时间】:2015-08-28 22:06:28
【问题描述】:

我在 Rails 中有一个非常简单的用例——点击端点 /users/show/:id 会将该用户的状态更新为 'accepted' 并向他们展示他们的应用程序。

控制器规范

class UsersController < ApplicationController
  def show
    User.find(params[:id]).update_all(status: 'pending')
    @some_variable = 'blahblah'
  end
end

测试

require "spec_helper"

RSpec.describe UsersController do
  describe "GET show" do
    it "should set user to accepted status" do
      get :show, { id: 1, foo: 'bar' }
      expect(User.find(1).status).to eq('accepted')
    end
  end
end

问题

以上对我来说失败了,这告诉我更新状态的控制器代码从未真正运行过。

get() 是否真的点击了路由并运行控制器操作,还是只是发出模拟请求?我尝试在控制器中放入一些puts 语句,但没有看到它们的输出,这让我进一步相信控制器逻辑永远不会被调用。

如果是后者,我怎样才能真正调用我的控制器动作?

谢谢!

【问题讨论】:

  • 测试失败仅仅是因为用户的状态不被接受,还是某处出现错误?
  • 我编辑了我的帖子,但感觉控制器动作本身永远不会被调用。在控制器中添加一些puts 语句,甚至是binding.pry 似乎都不起作用,因为这些语句永远不会执行。
  • update_all(status: 'pending'),如果我是对的,您是否将状态更新为“待处理”?

标签: ruby-on-rails rspec controller request


【解决方案1】:

是的。为了说明您可以这样简化控制器:

class UsersController < ApplicationController
  def show
  end
end

然后像这样测试它:

describe "GET show" do
    it "should return 200 status" do
      get :show, { id: 1, foo: 'bar' }
      expect(response.status).to eq(200)
    end
end

供您参考:https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs

【讨论】:

  • 谢谢。我从您的评论中意识到我尚未进行身份验证,并且我的请求正在生成 302 重定向以让我登录。
  • 很高兴我能帮上忙——尽管是间接的。 :)
【解决方案2】:

我怀疑,你的表演动作应该是这样的,

class UsersController < ApplicationController
  def show
    User.find(params[:id]).update_all({stauts: 'approved'},{ status: 'pending'})
    @some_variable = 'blahblah'
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多