Я пишу RSpe c запрос spe c, который выглядит примерно так (несколько сокращенно для краткости):
describe 'Items', type: :request do
describe 'GET /items' do
before do
allow_any_instance_of(ItemsController).to receive(:current_user).and_return(user)
get '/items'
@parsed_body = JSON.parse(response.body)
end
it 'includes all of the items' do
expect(@parsed_body).to include(item_1)
expect(@parsed_body).to include(item_2)
end
end
end
Контроллер выглядит так:
class ItemsController < ApplicationController
before_action :doorkeeper_authorize!
def index
render(json: current_user.items)
end
end
Как видите, я пытаюсь заглушить метод привратника current_user
.
Тесты в настоящее время проходят, и контроллер работает, как и ожидалось. У меня вопрос по поводу строки:
allow_any_instance_of(ItemsController).to receive(:current_user).and_return(user)
Я написал эту строку на основе ответов в Как заглушить метод ApplicationController в запросе spe c, и он работает. Тем не менее, документы RSpe c называют это "запахом кода" и rubocop-rspec
жалуются, "RSpec/AnyInstance: Avoid stubbing using allow_any_instance_of
".
Одной из альтернатив будет получение ссылки на контроллер и используйте instance_double()
, но я не уверен, как получить ссылку на контроллер из запроса spe c.
Как мне написать этот тест, чтобы избежать запаха кода / устаревших подходов к тестированию?