第10章ruby on rails预计nil不能为零

时间:2015-12-31 20:14:35

标签: ruby-on-rails ruby testing login null

我在测试中遇到了一些问题,他们经常失败,我想我有一个想法,但是因为你们经验丰富我正在寻求帮助!

这是错误:

DEPRECATION WARNING: You attempted to assign a value which is not explicitly `true` or `false` to a boolean column. Currently this value casts to `false`. This will change to match Ruby's semantics, and will cast to `true` in Rails 5. If you would like to maintain the current behavior, you should explicitly handle the values you would like cast to `false`. (called from create at /home/ubuntu/workspace/sample_app/app/controllers/sessions_controller.rb:9)
DEPRECATION WARNING: You attempted to assign a value which is not explicitly `true` or `false` to a boolean column. Currently this value casts to `false`. This will change to match Ruby's semantics, and will cast to `true` in Rails 5. If you would like to maintain the current behavior, you should explicitly handle the values you would like cast to `false`. (called from create at /home/ubuntu/workspace/sample_app/app/controllers/sessions_controller.rb:9)
 FAIL["test_login_with_valid_information_followed_by_logout", UsersLoginTest, 1.5503864830825478]
 test_login_with_valid_information_followed_by_logout#UsersLoginTest (1.55s)
        Failed assertion, no message given.
        test/integration/users_login_test.rb:22:in `block in <class:UsersLoginTest>'

这是我得到的第二个错误

DEPRECATION WARNING: You attempted to assign a value which is not explicitly `true` or `false` to a boolean column. Currently this value casts to `false`. This will change to match Ruby's semantics, and will cast to `true` in Rails 5. If you would like to maintain the current behavior, you should explicitly handle the values you would like cast to `false`. (called from create at /home/ubuntu/workspace/sample_app/app/controllers/sessions_controller.rb:9)
 FAIL["test_login_with_remembering", UsersLoginTest, 0.4226432810537517]
 test_login_with_remembering#UsersLoginTest (0.42s)
        Expected nil to not be nil.
        test/integration/users_login_test.rb:42:in `block in <class:UsersLoginTest>'

这是我的test/integration/users_login_test.rb

require 'test_helper'

class UsersLoginTest < ActionDispatch::IntegrationTest

    def setup
        @user = users(:michael)
    end

    test "login with invalid information" do
    get login_path
    assert_template 'sessions/new'
    post login_path, session: { email: "", password: "" }
    assert_template 'sessions/new'
    assert_not flash.empty?
    get root_path
    assert flash.empty?
    end 

  test "login with valid information followed by logout" do
    get login_path
    post login_path, session: { email: @user.email, password: 'password' }
    assert is_logged_in?
    assert_redirected_to @user
    follow_redirect!
    assert_template 'users/show'
    assert_select "a[href=?]", login_path, count: 0
    assert_select "a[href=?]", logout_path
    assert_select "a[href=?]", user_path(@user)
    delete logout_path
    assert_not is_logged_in?
    assert_redirected_to root_url
    #simula al usuario saliendo de la sesion en otra ventana
    delete logout_path
    follow_redirect!
    assert_select "a[href=?]", login_path
    assert_select "a[href=?]", logout_path,      count: 0
    assert_select "a[href=?]", user_path(@user), count: 0
    end  

    test "login with remembering" do
            log_in_as(@user, remember_me: '1')
            assert_not_nil cookies['remember_token']
    end
    test "login without remembering" do
            log_in_as(@user, remember_me: '0')
            assert_nil cookies['remember_token']
    end
end

这是必要的session controller.rb

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      # loguea al usuario y redirecciona a la pagina del usuario
      if user.activated?
      log_in user
      params[:session][:remember_me] == '1'? remember(user) : forget(user)
      redirect_back_or user
      else
      message = "Cuenta no activada"
      message += "Por favor y no te lo repito mas anda a tu mail para activar tu cuenta forro"
      flash[:warning] = message
      redirect_to root_url
      end
    else
      # Crea un mensaje de error
      flash.now[:danger] = "email/contraseña incorrectos"
     render 'new'
    end  
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end
end

test helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
  def is_logged_in?
    !session[:user_id].nil?
  end

  # Logs in a test user.
  def log_in_as(user, options = {})
      password = options[:password]       || 'password'
      remember_me = options[:remember_me] || '1'
     if integration_test?
        post login_path, session: { email: user.email,
                                    password: password,
                                    remember_me: remember_me }
      else
        session[:user_id] = user.id
     end
  end

  private
# Returns true inside an integration test.
  def integration_test?
      defined?(post_via_redirect) 
  end
end

我做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我刚刚在User.yml找到答案我写了activated: true,但是这是正确的文件,现在一切正常:D

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>
  admin: true
  activated: true
  activated_at: <%= Time.zone.now %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

lana:
  name: Lana Kane
  email: hands@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

mallory:
  name: Mallory Archer
  email: boss@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

<% 30.times do |n| %>
user_<%= n %>:
  name:  <%= "User #{n}" %>
  email: <%= "user-#{n}@example.com" %>
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>
<% end %>