【问题标题】:rspec controller testing with deviserspec 控制器测试与设计
【发布时间】: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的前块里面执行的
  • 好吧,您可以使用pry gem 来调试应用程序......将其引入操作、规范代码并查看上下文
  • 我检查了@user,它在it 块中可用,但代码仍然失败。 @user.current_sign_in_at = nil 不过。这有关系吗?

标签: ruby-on-rails rspec devise factory-bot


【解决方案1】:

在 rails_helper 中添加以下行。

config.include ControllerMacros, :type => :controller 

SEE这个话题。

我假设这只会在 rspec 中失败。当您在浏览器中测试时,它工作正常。

【讨论】:

  • Shishir,我使用了 extend,将其更改为包含,现在只能在 itbefore 块中使用 login_user。如我所见,它已经在 before 块中。我错过了什么?
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多