Общая проблема заключается в том, что переменные в тестах (например, переменные в любой программе) должны обладать наименьшим охватом. Это упрощает чтение для читателей, поскольку это минимизирует количество кода, о котором они должны думать, и часто позволяет время выполнения быть более эффективным. Поэтому, если переменная экземпляра (или в текущей RSpec, переменная let
) может быть локальной (без дублирующего кода или потери эффективности), она должна быть.
Назад, когда наилучший доступный способ передачи данных из блока before
в пример (блок it
) был в переменной экземпляра, я всегда видел спецификации, подобные вашему примеру. Иногда они были написаны неопытными программистами, которые видели множество переменных экземпляра, используемых в спецификациях, и немыслимо имитировали это. (Я все еще вижу ту же ошибку в контроллерах Rails.) Иногда они возникали из-за того, что кто-то вложил блок перед блоком, но не стал беспокоиться об изменении переменных экземпляра, которые больше не нужны, чтобы быть переменными экземпляра в locals.
В эти дни RSpec предоставляет let
. Одна из причин, почему let
лучше, чем переменная экземпляра, заключается в том, что переменная let
выглядит как locals, поэтому вам не нужно менять их, если вы меняете локальную на переменную let
или наоборот. Тем не менее, я все еще часто вижу проблему тестовых данных, которая используется только в одном примере, определяемом переменной let
, когда она может и должна быть локальной. Подобно чрезмерному использованию переменных экземпляра, иногда это происходит от неопытных программистов, которые немыслимо имитируют примеры, а иногда и после сбоя при очистке после изменения теста делает ненужной переменную let
.
«Люди обычно используют» - люди? По моим наблюдениям, это не распространено. И да, если '@ user' не используется в другом месте (' after: every' или что-то еще), то он также может быть локальным. –
@SergioTulentsev да, я, вероятно, прыгал с пистолетом, говоря «обычно». Я просто попытался найти несколько примеров и мог найти это только в последних SO-вопросах, которые я видел http://stackoverflow.com/questions/17396159/reloading- a-object-not-working-in-rspec – wired00
Как уже упоминалось - это не распространено, и я рассматриваю его как анти-шаблон. Вместо этого используйте 'let' и' let !'. Люди используют это, потому что считают, что это правильно. – BroiSatse