RSpec期望使用==比较帐户返回nil

时间:2018-04-13 02:57:02

标签: ruby-on-rails rspec

我正在尝试为帐户控制器创建控制器规范。我正在使用设计进行身份验证,用户必须先登录才能访问网站上的任何内容。

这是我写的规范:

require 'rails_helper'

RSpec.describe AccountsController do
  before (:each) do
    user = FactoryBot.create(:user, role: 'admin')
  end

  describe 'GET index' do
    it 'assigns @accounts' do
      account = FactoryBot.create(:account)
      get :index
      expect(assigns(:accounts)).to eq([account])
    end
  end
end

我也使用pundit进行身份验证,所以这意味着用户必须具有admin角色才能访问在索引测试之上的before语句中完成的页面。

这是我得到的错误:

Failure/Error: expect(assigns(:accounts)).to eq([account])

expected: [#<Account id: 140, name: "cool account", created_at: "2018-04-13 02:53:38", updated_at: "2018-04-13 ... 02:53:38", logo_file_name: nil, logo_content_type: nil, logo_file_size: nil, logo_updated_at: nil>]
got: nil

我的accounts控制器中的索引操作非常简单。

def index
  @accounts = Account.all
  authorize @accounts
end

如果我在nil行动中明确创建帐户,为什么会返回index?我刚刚开始测试,所以请原谅我,如果这是显而易见的。在看了很多关于这个的SO帖子并尝试他们的解决方案后,我没有找到解决办法。

这也是我的工厂。

帐户工厂

FactoryBot.define do
  factory :account do
    name 'cool account'
  end
end

用户工厂

FactoryBot.define do
  factory :user do
    first_name { Faker::Name.first_name }
    last_name  { Faker::Name.last_name }
    email      { Faker::Internet.email }
    password   "password"
  end
end

1 个答案:

答案 0 :(得分:0)

您遇到的问题是您在before(:each)中创建了一个用户,但您没有签入他。因此,Controller的操作永远不会执行,因为它不会通过Devise身份验证。

before (:each) do
  user = FactoryBot.create(:user, role: 'admin')
end

您需要做的是,首先将Devise助手添加到spec/rails_helper.rb

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :controller
end

请注意,我在RSpec块中添加了该内容。

之后您可以使用sign_in帮助程序,因此您应该在测试中以这样的方式为您的用户签名:

require 'rails_helper'

RSpec.describe AccountsController do
  before (:each) do
    sign_in FactoryBot.create(:user, role: 'admin')
  end

  describe 'GET index' do
    it 'assigns @accounts' do
      account = FactoryBot.create(:account)
      get :index
      expect(assigns(:accounts)).to eq([account])
    end
  end
end

它应该有用。

您可以在此处找到更多信息&gt; https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29