Rspe c тесты терпят неудачу при использовании Rails.cache, но проходят, если я делаю binding.pry - PullRequest
3 голосов
/ 03 апреля 2020

У меня странная проблема, когда я тестирую контроллер с процедурой, использующей кеширование. Тест не пройден, но если я выполняю binding.pry внутри метода, который выполняет кэширование, тест проходит.

пример метода, содержащего кэширование и binding.pry:

def method_example:
  data = Rails.cache.fetch(cache_key) do
    ProcedureService.new(params).generate
  end

  binding.pry

  data
end

Пример теста:

  it "reverts record amount" do
    expect(record.amount).to eq((original_amount + other_amount).to_d)
  end

Кэширование выполняется через redis_store.

Когда выполняется в среде разработки, все работает нормально. Что я не понимаю, так это почему он терпит неудачу, но проходит при добавлении пробки? Похоже, что это может быть что-то около времени, необходимого для извлечения кеша

UPDATE

Использование сна вместо связывания. Можно предположить, что это проблема времени. В чем конкретно проблема? и как я мог справиться с этим?

1 Ответ

0 голосов
/ 07 мая 2020

Я думаю, что это связано с тем, что кэширование включено или не включено в ваших тестах:

вы можете установить такие ожидания с текущей реализацией в вашем примере метода:

expect(Rails).to receive_massage_change(:cashe, :fetch).and_return(expected_value)

you также можно внедрить экземпляр ProcedureService в метод и установить для него ожидание следующим образом:

procedure_service_instance = instance_double('ProcedureService', generate: some_value_you_want_to_be_returned)

expect(procedure_service_instance).to receive(:generate)

, если вы сделаете свой пример метода следующим образом:

def method_example
  data = Constant.fetch_from_cashe(cache_key)
  procedure_service.generate
  data
end

тогда вы можете git избавление от receive_message_chain ожидание и использование:

expect(Constant).to receive(:fetch_from_cashe).with(cashe_key).and_return(expected_value)
expect_any_instance_of(ProcedureService).to receive(:generate){ some_fake_return_value }

также вы можете включить кэширование в своих тестах, проверьте следующие ссылки: link1 , link2 , link3

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

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