Как отключить кэширование запросов Active Record в тестах?Или использовать перезагрузку умнее? - PullRequest
2 голосов
/ 03 сентября 2011

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

Кажется, что многие переменные не имеют значений, которые, как я думал, будут, и я обнаружил, что должен использовать 'reload'.Сейчас я использую 'reload' слишком часто, чтобы убедиться, что у меня самые последние данные из БД.

Когда именно я должен использовать «перезагрузку», или я должен просто отключить кэширование вообще?

Например, эта строка в одном из моих тестов не будет работать без битов перезагрузки:

assert_equal @ fl1.reload.orig_price, @ fl1.lesson.reload.price #цена сбрасывается в предыдущем

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

Может кто-нибудь пролитькакой-то свет на это?

1 Ответ

0 голосов
/ 03 сентября 2011

По сути, если вы работаете только в памяти, вам не нужно использовать reload. Если вы идете прямо в базу данных, вам понадобится.

Итак, в общем, что-то вроде:

@user = User.create!(:name => "John Doe", :age => 100, :login => "jdoe")
assert_equal "John Doe", @user.name

Это будет прекрасно работать, потому что все в этом объекте находится в памяти.

Теперь, допустим, вы сделали что-то вроде:

@user.pictures << Picture.create!(:locn => "/images/my_image.jpg")
assert @user.contains_picture(/images/"my_image.jpg")

и этот метод contains_picture был определен в user.rb как:

def contains_picture(path)
    User.includes(:picture).where("pictures.locn = ?", path)
end

Поскольку этот метод отправляется непосредственно в базу данных, он потерпит неудачу, поскольку не найдет эту картинку. Вместо этого, после добавления рисунка в коллекцию .pictures, вам нужно будет сделать @user.save!

Итак, это зависит от того, что происходит с объектом и как выглядят используемые методы, и это скажет вам, нужно ли вам reload или нет.

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