我正在尝试为帐户控制器创建控制器规范。我正在使用设计进行身份验证,用户必须先登录才能访问网站上的任何内容。
这是我写的规范:
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
答案 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