2017-02-22 103 views
0

Я изучаю, как писать автоматические тесты в рельсах, и у меня возникает проблема. Вот мой тест:Неопределенный метод '[]' для класса nil во время теста

test "login invalido" do 
    get new_usuario_path 
    assert_template 'usuarios/new' 
    post login_path, params: { sessao: { email: "", password: "" } } 
    assert_template 'usuarios/new' 
    assert_not flash.empty? 
    get root_path 
    assert flash.empty? 
end 

А вот метод login_path:

def create 
byebug 
u = Usuario.find_by(email: params[:sessao][:email].downcase) #the error happens here 
if u.present? && u.authenticate(params[:sessao][:password]) 
    puts "aqui" 
else 
    flash[:danger] = 'Ops! Email ou senha inválidos.' 
    redirect_to new_usuario_path 
end 
end 

редактировать: Я пометил строку, в которой происходит выше ошибка.

Я пытаюсь проверить, отображается ли сообщение об ошибке вспышки и не задерживается во время навигации (я использую в качестве ссылки this book). Я ожидал получить отказ в этом тесте, но вместо этого я получаю сообщение об ошибке:

1) Error: 
LoginTest#test_login_invalido: 
NoMethodError: undefined method `[]' for nil:NilClass 
app/controllers/sessao_controller.rb:7:in `create' 
test/integration/login_test.rb:7:in `block in <class:LoginTest>' 

Похоже, что params хэш неверен, но при выполнении теста с byebug я вижу, что хэш правильно прибывающий:

(byebug) params 
{"params"=>{"sessao"=>{"email"=>"", "password"=>""}}, "controller"=>"sessao", "action"=>"create"} 

Что мне не хватает?

+0

'params' - это метод? –

+0

Нет, params - это хеш с параметрами, которые будут переданы методу 'create' и будут использоваться здесь:' u = Usuario.find_by (email: params [: sessao] [: email] .downcase) ' – Tuma

+0

вы не отправляете любые параметры в метод создания. –

ответ

1

В PARAMS вы проезжаете является экземпляром класса Hash не ActionController::Parameters

Таким образом, либо сделать хэш .with_indifferent_access

post login_path, params: { sessao: { email: "", password: "" } }.with_indifferent_access 

Или

ActionController::Parameters.new({ sessao: { email: "", password: "" } }) 
+0

Пробовал 'ActionController :: Parameters.new ({sessao: {email:" ", password:" "}})' line, и он отлично работал! Спасибо! – Tuma

+1

@Tuma Я думаю, что это исправляло вашу проблему по совпадению. вы случайно вложили свои параметры в ключ «param». изменение вашей почты на эту проблему также устранит проблему: 'post login_path, sessao: {email:" ", password:" "}' – eiko

+0

Это правда, оставив только хэш 'sessao'. – Tuma

0

Попробуйте параметры ["sessao"] ["email"]. Я думаю, что в Ruby:! Переменный = "переменный"

+0

Я попытался изменить его с символа на строка в методе 'create' и как в тесте, так и в методе, но ошибка сохраняется ... – Tuma

+0

' byebug' указывает, что оба параметра: params [: sessao] 'и' params ["sessao"] 'are' nil' , но просто 'params' показывает полный хеш. Очень странно. – Tuma

 Смежные вопросы

  • Нет связанных вопросов^_^