Как мне протестировать RoR current_user - PullRequest
0 голосов
/ 02 мая 2020

У меня есть этот метод, чтобы проверить, является ли пользователь admin:

def admin?
  current_user.admin == true
end

Модульный тест:

require 'rails_helper'

describe StubController do
  describe '.admin?' do
    it "should tell if the user is admin" do
      user = User.create!(email: "i@i.com", password:'123456', role: "admin", name: "Italo Fasanelli")

      result = user.admin?

      expect(result).to eq true
    end
  end
end

Проблема в том, что simplecov говорит мне, что эта часть current_user.admin == true не распространяется.

Как мне проверить current_user в этом тесте?

1 Ответ

1 голос
/ 02 мая 2020

Прежде всего, переместите метод admin? на модель User, чтобы его можно было повторно использовать в Model-View-Controller.

class User < ApplicationRecord
  def admin?
    role == 'admin'
  end
end

Этот метод можно использовать везде, где у вас есть доступ к экземпляр User. Так что current_user.admin? также будет работать для всех видов и контроллеров.

Теперь вы должны написать тест для модели, а не контроллера. Также я заметил, что вы создаете объект пользовательской модели вручную вместо использования Factory. Используйте FactoryBot для создания необходимых экземпляров для тестирования.

Вот краткое описание c при условии, что для пользователя установлена ​​фабрика

require 'rails_helper'

RSpec.describe User, type: :model do
  describe '.admin?' do
    context 'user has role set as admin' do
      let!(:user) { build(:user, role: 'admin') }

      it 'returns true' do
        expect(user).to be_admin
      end
    end

    context 'user has role set as non admin' do
      let!(:user) { build(:user, role: 'teacher') }

      it 'returns true' do
        expect(user).not_to be_admin
      end
    end
  end
end
...