新手问题 Ruby on Rails tutorial,遇到的问题?

yirolhao · 2016年11月22日 · 最后由 pinewong 回复于 2016年11月23日 · 2167 次阅读
def setup
  @user = users(:little)
end

  test "login with valid information" do
    get login_path
    post login_path, params: { session: { email:    @user.email,
                                          password: 'password' } }
    assert_redirected_to @user
    follow_redirect!
    assert_template 'users/show'
    assert_select "a[href=?]", login_path, count: 0
    assert_select "a[href=?]", logout_path, count: 1
    assert_select "a[href=?]", user_path(@user), count: 1
  end
def setup
  @user = User.first
end

  test "login with valid information" do
    get login_path
    post login_path, params: { session: { email:    @user.email,
                                          password: '111111' } }
    assert_redirected_to @user
    follow_redirect!
    assert_template 'users/show'
    assert_select "a[href=?]", login_path, count: 0
    assert_select "a[href=?]", logout_path, count: 1
    assert_select "a[href=?]", user_path(@user), count: 1
  end

第一个是书上给的,第二个是我改了之后的,第二个测试无法通过,说是希望重定向,结果得到的是成功,但是把正确的密码'111111'改成'password' 测试竟然神奇的可以通过,书上说约定固件的密码为'password',应该和这没关系吧?为啥啊?

Failure: UsersLoginTest#test_login_with_valid_information [/home/yirolhao/ruby/project/rails/my-first-app/test/integration/users_login_test.rb:35]: Expected response to be a <3XX: redirect>, but was a <200: OK>

逻辑上来说,密码不对怎么会让你登录并重定向到 user 界面? 另外,你确定 User.firstusers(:little) 是同一个?

#1 楼 @jiazhen 不是同一个,User.first 是数据库中存储的数据,而 users(:little) 是固件中定义的,数据库中那个的密码是'111111'转换之后的摘要,而用正确的密码没有重定向,不管使用什么字符串都是那个错误,除非使用的是'password',就是对的。

测试的时候数据库是空的 所以你的@user是空的

#3 楼 @hging 都忘记了,test 和 development 是两个数据库,但为么"password" 这个可以通过呢?

#4 楼 @yirolhao 这个要看下你的controller怎么写的了。如果从测试得到的结果不是你想要的结果,那肯定是被测试的代码写的有问题,否则测试就失去了意义。

#5 楼 @hging

user = User.find_by(email: params[:session][:email].downcase)

if user && user.authenticate(params[:session][:password])
    log_in user
    redirect_to user
else
    flash.now[:danger] = 'Invalid email/password combination' 
    render 'new'
end

暂时看,是测试环境下,你修改的 User.first 仍然取到了 fixture 里的 little 用户

然后用 111111 测试,返回了成功,但这个是 http 请求成功,就是说此时密码错误了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号