未定义的方法' []'在测试期间为零级

时间:2017-02-22 14:02:57

标签: ruby-on-rails ruby testing automated-tests

我正在学习如何在rails中编写自动化测试,并且我遇到了问题。这是我的考试:

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

编辑:我标记了上面发生错误的行。

我尝试验证是否显示了Flash错误消息,并且在导航过程中没有留下(我使用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"}

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您传递的参数是类Hash而不是ActionController::Parameters

的实例

所以,要么制作哈希.with_indifferent_access

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

或者

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

答案 1 :(得分:0)

尝试params [&#34; sessao&#34;] [&#34;电子邮件&#34;]。 我认为在ruby中:变量!=&#34;变量&#34;