Метод заглушки RSpec с переменной - PullRequest
0 голосов
/ 01 июля 2018

Проверка помощника, и я столкнулся с проблемой.

У меня есть область действия на модели: Task.due_within(days)

И на это ссылается помощник:

module UsersHelper
  ...
  def show_alert(tasks, properties, user)
    pulse_alert(tasks, properties) ||
      tasks.due_within(7).count.positive? ||
      tasks.needs_more_info.count.positive? ||
      tasks.due_within(14).count.positive? ||
      tasks.created_since(user.last_sign_in_at).count.positive?
  end
  ...
end

Итак, я тестирую с заглушками для tasks, properties и user:

RSpec.describe UsersHelper, type: :helper do
  describe '#show_alert' do
    it 'returns true if there are tasks due within 7 days' do
      tasks = double(:task, due_within: [1, 2, 3, 4], past_due: [])
      properties = double(:property, over_budget: [], nearing_budget: [])
      user = double(:user)

      expect(helper.show_alert(tasks, properties, user)).to eq true
    end

    it 'returns true if there are tasks due within 14 days' do
      # uh oh. This test would be exactly the same as above.
    end
  end
end

Это проходит, но когда я пошел писать тест для it 'returns true if there are tasks due within 14 days, я понял, что мой double(:task, due_within: []) не взаимодействует с переменной, предоставленной методу.

Как мне написать заглушку, которая заботится о переменной, предоставленной методу?

Очевидно, это не работает:

tasks = double(:task, due_within(7): [1, 2], due_within(14): [1, 2, 3, 4])

1 Ответ

0 голосов
/ 02 июля 2018

Чтобы справиться с разными случаями, не могли бы вы попробовать что-то подобное?

allow(:tasks).to receive(:due_within).with(7).and_return(*insert expectation*)
allow(:tasks).to receive(:due_within).with(14).and_return(*insert expectation*)

Поскольку вы тестируете метод show_alert, возможно, вы захотите изолировать свой тест только от метода show_alert, т.е. смоделировать возвращаемое значение due_within, как указано выше. Функциональность due_within будет обрабатываться в отдельном тестовом примере.

...