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

yirolhao · November 22, 2016 · Last by pinewong replied at November 23, 2016 · 2157 hits
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 请求成功,就是说此时密码错误了

You need to Sign in before reply, if you don't have an account, please Sign up first.