测试

时间:2017-11-03 02:17:46

标签: ruby-on-rails testing devise routing ruby-on-rails-5

我不知道这个问题。使用宝石设计和全球化。 我不知道是不是原因,但是form_for在html中生成了错误的操作,看看:

form class =“edit_status”id =“edit_status_1”action =“/ 1 / statuses / update”method =“post”accept-charset =“UTF-8”

我在状态之前放置。我不知道为什么。

的form_for

form_for(@status,url:statuses_update_path(@status),方法:: post)do | f |

设置方法帖子,因为控制器在没有它的情况下接收 id = update

下面的问题详情。

错误

No route matches {:action=>"/statuses/390022407", :controller=>"statuses", :status
=>{:content=>"Lorem ipsum"}}

Routes.db

Rails.application.routes.draw do
   scope "(:locale)", locale: /en|pl/ do
      post 'statuses/update'
      resources :statuses, only: [:update]
   end
end

Rails路线

Routes

控制器

class StatusesController < ApplicationController
    before_action :authenticate_user!
    before_action :set_locale

    def update
        #code...
    end

    private
        def status_params
            params.require(:status).permit(:content)
        end

        def set_locale
            I18n.locale = params[:locale] || I18n.default_locale
        end
end

测试代码

require 'test_helper'

class StatusesControllerTest < ActionController::TestCase
    include Devise::Test::ControllerHelpers

    def setup
        @user = users(:brock)
        @status = statuses(:statusBrock)
        I18n.default_locale = :en
    end

    test "should not update when not logged in" do
        patch status_path(@status), params: { status: { content: "Lorem ipsum" } }
        assert_redirected_to new_user_session_path
    end

    test "should update when logged in user admin" do
        sign_in @user
        patch status_path(@status), params: { status: { content: "Lorem ipsum" } }
        assert_equal "Lorem ipsum", @status.content 
    end
end

有什么遗失?

1 个答案:

答案 0 :(得分:0)

我并不是很清楚你正在尝试做什么。

  post 'statuses/update'
  resources :statuses, only: [:update]

这里定义了两条路由 - 一条是状态/更新的帖子,没有额外的参数,第二条是/ status / status_id。

您正在调用

statuses_update_path(@status)

将@status作为参数传递给路径,除了路由不接受id参数之外,它接受一个语言环境参数。

您是否有理由希望路由成为状态/更新而不是更多RESTful状态/?我将删除第一个路由,并使用内置的Rails命名约定。

编辑: 此外,在您的测试代码中,您只测试第二条路线 - 它不清楚为什么您有这两条不同的路线,并且您需要在它们之间切换。