【发布时间】:2016-04-19 21:08:51
【问题描述】:
我正在使用 devise + rspec + factory + shoulda,但我的控制器规格有问题。我已阅读大量文章和文档,但无法弄清楚log_in 用户并使用该用户实例的最佳方法。
任务嵌套在用户下,因此索引路由是/users/:user_id/tasks 和任务belongs_to :assigner, class_name: "User" 和belongs_to :executor, class_name: "User"
目前使用以下代码,两个测试都失败了。正确登录用户并在控制器测试中使用它的最佳方法是什么?
第一个错误信息:
Failure/Error: expect(assigns(:tasks)).to eq([assigned_task, executed_task])
expected: [#<Task id: 1, assigner_id: 1, executor_id: 2, .....>, #<Task id: 2, assigner_id: 3, executor_id: 1, ......>]
got: nil
(compared using ==)
第二个错误:
Failure/Error: it { is_expected.to respond_with :ok }
Expected response to be a 200, but was 302
tasks_controller_spec.rb
require "rails_helper"
describe TasksController do
describe "when user is signed in" do
describe "collections" do
login_user
let(:assigned_task) { create(:task, assigner: @user) }
let(:executed_task) { create(:task, executor: @user) }
let(:other_task) { create(:task) }
context "GET index" do
before do
get :index, user_id: @user.id
end
it "assigns user's tasks" do
expect(assigns(:tasks)).to eq([assigned_task, executed_task])
end
it { is_expected.to respond_with :ok }
end
context "GET incoming_tasks"
end
end
end
controller_macros.rb
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
@user = create(:user)
sign_in @user
end
end
end
任务控制器
def index
@tasks = Task.alltasks(current_user).uncompleted.includes(:executor, :assigner).order("deadline DESC").paginate(page: params[:page], per_page: Task.pagination_per_page)
end
【问题讨论】:
-
请提供索引操作的代码,也请将
login_user编码为before(;each/:all)块。 -
更新了索引操作。 login_user 不是已经在 block 之前了吗?
-
我没看到
loginuser是在describe的前块里面执行的 -
好吧,您可以使用
prygem 来调试应用程序......将其引入操作、规范代码并查看上下文 -
我检查了@user,它在
it块中可用,但代码仍然失败。@user.current_sign_in_at = nil不过。这有关系吗?
标签: ruby-on-rails rspec devise factory-bot