RSpe c метод макета внутри цикла выбора - PullRequest
0 голосов
/ 23 февраля 2020

Я хочу протестировать простой класс, который выполняет итерацию по массиву хэшей и возвращает только те со статусом «Ожидание», которые были обновлены более 2 дней go.

  class FetchPending
    PROJECT_KEY = 'TPFJT'
    TWO_DAYS = Time.now - 2 * 24 * 60 * 60

    def call
      project.select do |issue|
        issue.fields.dig('status', 'name') == 'Pending' &&
          DateTime.parse(issue.fields.dig('updated')) < TWO_DAYS
      end
    end

    private

    def project
      @project ||= Jira::ProjectConnection.new(PROJECT_KEY).call
    end
  end

Как протестировать метод fields который является методом Jira- Ruby gem . Я думаю, что происходит отсюда (класс поля в ресурсе gem) , потому что больше нигде я не нашел fields метод.

Вот мои мысли после отладки:

  • project.class - массив

  • issue.class - JIRA :: Resource :: Issue

мое естественное мышление было :

  before do
    # (...) some other mocks
    allow(JIRA::Resource::Issue).to receive(:fields)
  end

Но я получаю сообщение об ошибке:

Ошибка / Ошибка: разрешить (JIRA :: Resource :: Issue). Получить (: поля)

JIRA :: Resource :: Issue не реализует: поля

Я боролся с этой проблемой в течение ДНЕЙ, я довольно отчаялся здесь. Как издеваться над этим методом?

Вот мои остальные характеристики:

RSpec.describe FetchPending do
  subject { described_class.new }

  let(:project_hash) do
    [
      {
        'key': 'TP-47',
        'fields': {
          'status': {
            'name': 'Pending'
          },
          'assignee': {
            'name': 'michael.kelso',
            'emailAddress': 'michael.kelso@example.com'
          },
          'updated': '2020-02-19T13:20:50.539+0100'
        }
      }
    ]
  end
  let(:project) { instance_double(Jira::ProjectConnection) }

  before do
    allow(Jira::ProjectConnection).to receive(:new).with(described_class::PROJECT_KEY).and_return(project)
    allow(project).to receive(:call).and_return(project_hash)
    allow(JIRA::Resource::Issue).to receive(:fields)
  end

  it 'return project hash' do
    expect(subject.call).include(key[:'TP-47'])
  end

1 Ответ

0 голосов
/ 26 февраля 2020

Это неправильный синтаксис, чтобы смоделировать его для возврата проекта; and_return предназначен для возврата значения (например, строки или целого числа), а не объекта; для объекта вы должны отправить его как блок. Кроме того, если call является допустимым методом для объекта Jira::ProjectConnection, который возвращает значение project_ha sh, вы можете напрямую смоделировать его поведение при объявлении вашего экземпляра double (эта функция неясна из документа Reli sh b. c они вроде ужасные). Что-то вроде этого, вероятно, будет работать:

let(:project) { instance_double(Jira::ProjectConnection, call: project_hash) }

before do
  # Ensure new proj conns always return mocked 'project' obj
  allow(Jira::ProjectConnection).to receive(:new).with(
    described_class::PROJECT_KEY
  ) { project }
end

Если это все еще не работает, попробуйте временно заменить described_class::PROJECT_KEY на anything для отладки; это может помочь вам подтвердить, что вы указали неправильные аргументы, отправляемые на new.

Что касается сообщения об ошибке, похоже, что JIRA :: Resource :: Issue не имеет fields атрибута / метода , хотя fields выглядит как быть вложенным в attrs? Метод JIRA::Resource::Project#issues также переводит проблемы в JSON в объекты Issue , поэтому, если вы используете этот метод, вам нужно будет изменить содержимое project_hash.

...