get请求调用是否实际运行控制器操作?

时间:2015-08-28 22:06:29

标签: ruby-on-rails rspec controller request

我在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语句,但没有看到它们的输出,这使我进一步相信控制器逻辑永远不会被调用。

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

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我怀疑,你的节目动作应该是这样的,

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