Давайте поговорим о том, что происходит:
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)