我在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
语句,但没有看到它们的输出,这使我进一步相信控制器逻辑永远不会被调用。
如果是后者,我怎样才能实际调用我的控制器动作?
谢谢!
答案 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