首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >rails教程第8章测试错误

rails教程第8章测试错误
EN

Stack Overflow用户
提问于 2018-02-16 22:36:06
回答 1查看 600关注 0票数 0

在Michael的Rails教程的第8.2.1章中,我得到了两个不同的测试错误。我刚接触过Rails,但是我已经三次检查语法错误和我能找到的其他任何东西。任何帮助都是非常感谢的。

错误消息1:错误“test_should_get_new”,Minitest::Result,0.9693643249993329 test_should_get_new#Minitest::Result (0.97 s) NameError: NameError:未定义局部变量或方法users_new_url' for #<UsersControllerTest:0x00000006e953f8> test/controllers/users_controller_test.rb:5:in

错误消息2:错误“test_invalid_signup_information”,Minitest::test_invalid_signup_information,0.8977870759990765 test_invalid_signup_information (0.90s) ActionController:RoutingError: ActionController::RoutingError:无路由匹配发布"/signup“测试/集成/用户_/signup_test.rb:8: in block (2 levels) in <class:UsersSignupTest>' test/integration/users_signup_test.rb:7:in

Routes.rb

代码语言:javascript
运行
复制
    Rails.application.routes.draw do

  root   'static_pages#home'
  get    '/help',    to: 'static_pages#help'
  get    '/about',   to: 'static_pages#about'
  get    '/contact', to: 'static_pages#contact'
  get    '/signup',  to: 'users#new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users

end

会话控制器:

代码语言:javascript
运行
复制
    class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      # Log the user in and redirect to the user's show page.
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
  end
end

用户控制器:

代码语言:javascript
运行
复制
    class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end
  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "Welcome to your new profile!"
      redirect_to @user
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

end

用户控制器测试

代码语言:javascript
运行
复制
    require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
  test "should get new" do
    get users_new_url
    assert_response :success
  end

end

用户注册测试

代码语言:javascript
运行
复制
    require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'users/new'

  assert_select 'div#error_explanation'
  assert_select 'div.field_with_errors'
  assert_select 'form[action="/signup"]'
  end

  test "valid signup information" do
    get signup_path
    assert_difference 'User.count', 1 do
      post users_path, params: { user: { name: "Example User",
                                        email: "user@example.com", 
                                        password:             "password",
                                        password_confirmation: "password" } }
    end
    follow_redirect!
    assert_template 'users/show'
    assert_not flash.nil?
  end

end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 23:01:00

在您的users_controller_test中,代码不知道users_new_url是什么。这可能是因为那条路不存在。您很可能不得不执行类似get new_user_path的操作,但是您可以通过键入rake routes并获得可用路由列表来查找。

下面是一个rake routes输出的示例:

代码语言:javascript
运行
复制
users     GET     /users(.:format)                    users#index
          POST    /users(.:format)                    users#create
new_user  GET     /users/new(.:format)                users#new
edit_user GET     /users/:id/edit(.:format)           users#edit
user      GET     /users/:id(.:format)                users#show

您可以通过将_path附加到名称中来引用命名路径。也就是说,users_path将映射到"users#index"控制器和方法。

rake routes还将帮助您解决第二个问题,即您没有为POST /signup定义的路由--您有一个GET /signup。

因此,您需要添加如下一行:

代码语言:javascript
运行
复制
post '/signup', to: 'users#create'

这个路径将映射到您的UsersController#create方法,我在代码中看到了这个方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48835822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档