Rspec matcher для случайного числа в хеш-значении - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь исправить тест, но поскольку мы запускаем тесты случайным образом, change_requests оказывается случайным, поэтому ожидаемый хеш в блоке before do всегда заканчивается неудачей.

Пример ошибки:

    Diff:
       @@ -1,4 +1,4 @@
       -:change_requests => [0, 0],
       +:change_requests => [23, 24],

Тест:

    let(:expected_hash) do
      {
        from_admin_user: user.first_name,
        station_id: station.id,
        ten_minutes_before_reminder: false,
        one_hour_after_reminder: false,
        change_requests: [0, 0],
        one: requests[0][:new_price],
        two: 'NO CHANGE',
        three: 'NO CHANGE',
        four: requests[1][:new_price],
        price_change_at_time: nil
      }

    end

    before do
      expect(PriceChangeService).to receive(:new) do |hash|
        expect(hash).to eq expected_hash
        price_change_service
      end
    end

Можно ли это решить, например, добавив случайное совпадение чисел в change_requests значение?

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Вы можете удалить случайный ключ с помощью:

expect(hash.except(:change_requests )).to eq 
  expected_hash.except(:change_requests)

Или заглушить метод, который генерирует change_requests, чтобы сделать его детерминированным.

1 голос
/ 29 октября 2019

Поскольку значение change_requests является динамическим, нам необходимо проверить две вещи:

1) change_requests - это массив, содержащий два элемента

2). остальная часть хэша, кроме change_requests, как и ожидалось (Здесь, change_requests удален из объявления ожидаемого_hash)

Мы могли бы достичь этого, используя метод reject для вновь созданного объекта PriceChangeService, чтобыпроверить все ключи и значения, КРОМЕ change_requests. Кроме того, нам нужно проверить значение change_requests, как указано в пункте (1).

Это можно сделать следующим образом:

before do
  expect(PriceChangeService).to receive(:new) do |hash|
    expect(hash.reject{|k, v| k == : change_requests}).to eq(expected_hash)
    expect(hash[:change_requests].class).to eq(Array)
    expect(hash[:change_requests].length).to eq(2)
    price_change_service
  end
end

Вы можете дополнительно проверить типожидаемые элементы.

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