Как заглушить zendesk_api current_user для спецификации? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть метод модели, для которого я пытаюсь написать спецификацию.Метод выглядит следующим образом:

def my_method
   puts current_user.user_attirbute
end 

Где current_user предоставляется гемом аутентификации, zendesk_api-1.14.4.Чтобы сделать этот метод тестируемым, я изменил его на следующее:

def my_method(user_attribute = nil)
   if user_attribute = nil
      user_attribute = current_user.user_attribute
   end 
   puts user_attribute
end

Этот рефакторинг работает и является тестируемым, но не выглядит хорошей практикой.В идеале гем должен был бы обеспечить своего рода помощника по тестированию, чтобы помочь заглушить / издеваться над current_user, но я ничего не смог найти.Есть предложения?

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете пойти простым путем и просто проверить возвращение правильного значения методом current_user#user_attribute.Пример:

describe '#my_method' do 
  subject { instance.my_method } # instance is an instance of your class where #my_method is defined

  let(:user) { instance_spy(ZendeskAPI::User, user_attribute: attr) }
  let(:attr} { 'some-value' }

  before do
    allow(instance).to receive(:current_user).and_return(user)
  end 

  it { is_expected.to eq(attr) }
end

Но я бы пошел с кассетой видеомагнитофона (здесь vcr gem ), потому что это ответ стороннего API, чтобы минимизировать риск ложноположительного результата.Следующий пример демонстрирует тестирование с записанным ответом (только в случае, если метод #current_user выполняет запрос к zendesk):

describe '#my_method', vcr: { cassette_name: 'zendesk_current_user' } do 
  subject { instance.my_method } 

  it { is_expected.to eq(user_attribute_value) } # You can find the value of user_attribute_value in recorded cassette
end

PS Я предположил, что вы добавили puts в свой метод для отладки.Если оно сделано намеренно и является частью логики - замените eq на output в моем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...