2016-03-09 1 views
0

Я заметил примеры использования переменной экземпляра в модульных тестов RSpec и т.д.Почему переменные экземпляра иногда используются в тестах RSpec?

Что-то вроде этого:

it 'should update something' do 
    @user = user(:userone) 
    @attr = { 
    :name => 'this', 
    :phone => 'that' 
    } 
    put :update, :id => @user.id, :user => @attr 

    @user.reload 
    expect(response.status).to eq(200) 
    expect(@user.name).to eq('this') 
    expect(@user.phone).to eq('that') 
end 

Почему бы просто не использовать локальные переменные, если не устанавливать переменную в пределах before :each и т.д.?

+0

«Люди обычно используют» - люди? По моим наблюдениям, это не распространено. И да, если '@ user' не используется в другом месте (' after: every' или что-то еще), то он также может быть локальным. –

+0

@SergioTulentsev да, я, вероятно, прыгал с пистолетом, говоря «обычно». Я просто попытался найти несколько примеров и мог найти это только в последних SO-вопросах, которые я видел http://stackoverflow.com/questions/17396159/reloading- a-object-not-working-in-rspec – wired00

+0

Как уже упоминалось - это не распространено, и я рассматриваю его как анти-шаблон. Вместо этого используйте 'let' и' let !'. Люди используют это, потому что считают, что это правильно. – BroiSatse

ответ

2

Общая проблема заключается в том, что переменные в тестах (например, переменные в любой программе) должны обладать наименьшим охватом. Это упрощает чтение для читателей, поскольку это минимизирует количество кода, о котором они должны думать, и часто позволяет время выполнения быть более эффективным. Поэтому, если переменная экземпляра (или в текущей RSpec, переменная let) может быть локальной (без дублирующего кода или потери эффективности), она должна быть.

Назад, когда наилучший доступный способ передачи данных из блока before в пример (блок it) был в переменной экземпляра, я всегда видел спецификации, подобные вашему примеру. Иногда они были написаны неопытными программистами, которые видели множество переменных экземпляра, используемых в спецификациях, и немыслимо имитировали это. (Я все еще вижу ту же ошибку в контроллерах Rails.) Иногда они возникали из-за того, что кто-то вложил блок перед блоком, но не стал беспокоиться об изменении переменных экземпляра, которые больше не нужны, чтобы быть переменными экземпляра в locals.

В эти дни RSpec предоставляет let. Одна из причин, почему let лучше, чем переменная экземпляра, заключается в том, что переменная let выглядит как locals, поэтому вам не нужно менять их, если вы меняете локальную на переменную let или наоборот. Тем не менее, я все еще часто вижу проблему тестовых данных, которая используется только в одном примере, определяемом переменной let, когда она может и должна быть локальной. Подобно чрезмерному использованию переменных экземпляра, иногда это происходит от неопытных программистов, которые немыслимо имитируют примеры, а иногда и после сбоя при очистке после изменения теста делает ненужной переменную let.

+0

Получает много смысла благодаря – wired00