rspec / тестирование объектов AR без перезагрузки - PullRequest
0 голосов
/ 15 мая 2018

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

let!(:deal) { create(:deal) }

Следующий пример:

expect {
  ...stuff that effectively associate an attachment to the deal...
}.to change { deal.attachments.length }.from(0).to(1)

не проходит.

Тот же тест при перезагрузкесделка:

...to change { deal.reload.attachments.length } ...

проходит.

В других случаях я часто использую этот метод reload.Такое ощущение, что это совсем не правильный путь, и я упускаю суть

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

1 Ответ

0 голосов
/ 16 мая 2018

Давайте поговорим о том, что происходит:

deal.attachments запрашивается дважды, один раз перед тем, как будет вызван ваш блок expect, а затем один раз после, чтобы сравнить разницу.

Поскольку rails знает, что затраты на базу данных являются высокими (с точки зрения производительности), она кэширует значения отношений has_many для экономии производительности. Итак, первый раз, когда вызывается deal.attachments, это единственный раз, когда запрос к базе данных фактически выполняется. Добавление reload вызывает второй запрос к базе данных, давая ожидаемый результат.

Итак, это сводится к тому, «Как мне убедиться, что база данных запрашивается каждый раз?»

Метод, который вы используете, это то, что я считаю приемлемым, но есть и другие варианты. Я бы предложил использовать count вместо length.

Счет будет выполнен с использованием SQL.

Это гарантирует, что запрос SQL будет выполнен до и после вызова вашего блока expect.

expect {
  ...stuff that effectively associate an attachment to the deal...
}.to change { deal.attachments.count }.by(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...