簡體   English   中英

Ruby-on-rails 測試在呈現 JS 視圖時引發 InvalidCrossOriginRequest

[英]Ruby-on-rails test raising InvalidCrossOriginRequest when rendering a JS view

我正在測試一個控制器,它具有以 .js.erb 格式呈現視圖的動作。 對這些操作的測試會引發以下錯誤:

Minitest::UnexpectedError: ActionController::InvalidCrossOriginRequest: 安全警告:另一個站點上的嵌入標記請求受保護的 JavaScript。 如果您知道自己在做什么,請繼續並禁用此操作的偽造保護以允許跨源 JavaScript 嵌入。

偽造保護導致此錯誤,因為當我對這些操作設置異常時,它可以,但我不想禁用它。

這是我的控制器:

class TasksController < ApplicationController

  def new
    # TODO add blah later
    @task = Task.new
    render 'tasks/show_form.js.erb'
  end

  def create
    # FIXME there is bug here
    @task = Task.new(task_params)
    @task.user = current_user
    authorize! :create, @task
    save_task
  end

  def edit
    @task = Task.find(params[:id])
    authorize! :edit, @task
    render 'tasks/show_form.js.erb'
  end

  def update
    @task = Task.find(params[:id])
    @task.assign_attributes(task_params)
    authorize! :update, @task
    save_task
  end

  def destroy
    @task = Task.find(params[:id])
    authorize! :destroy, @task
    @task.destroy
    @tasks = Task.accessible_by(current_ability)
  end

  private

  def save_task
    if @task.save
      @tasks = Task.accessible_by(current_ability)
      render 'tasks/hide_form.js.erb'
    else
      render 'tasks/show_form.js.erb'
    end
  end

  def task_params
    params.require(:task).permit(:title, :note, :completed)
  end
end

這是我對這個控制器的測試:

require 'test_helper'

class TasksControllerTest < ActionDispatch::IntegrationTest
  #include Devise::Test::ControllerHelpers

  def setup
    @task = tasks(:one)
    @password = "password"
    @confirmed_user = User.create(email: "#{rand(50000)}@example.com",
                                  password: @password,
                                  confirmed_at: "2020-02-01 11:35:56")
    @unconfirmed_user = User.create(email: "#{rand(50000)}@example.com",
                                    password: @password,
                                    confirmed_at: "")
    sign_in(user: @confirmed_user, password: @password)

  end

  test "should get new" do
    get new_task_url
    assert_response :success
  end

  test "should create task" do
    assert_difference('Task.count') do

      post tasks_url, params: {task: {title: 'Dont fail test !'}}
    end

    assert_redirected_to task_url(Task.last)
  end

  test "should get edit" do
    get edit_task_url(@task)
    assert_response :success
  end

  test "should update task" do
    patch task_url(@task), params: {task: {title: 'updated'}}
    assert_redirected_to task_url(@task)
    article.reload
    assert_equal "updated", article.title
  end

  test "should destroy task" do
    assert_difference('Task.count', -1) do
      delete task_url(@task)
    end

    assert_redirected_to tasks_url
  end
end

你們中有人知道如何糾正這個錯誤嗎?

先感謝您

您可以嘗試更改 get 請求以使用瀏覽器對 AJAX 請求的相同機制,即 XMLHttpRequest。 您可以使用xhr在 rails 測試中執行此操作

在你的情況下:

xhr :get, new_task_url

這意味着您不是為了讓測試通過而繞過 rails 默認值。

解決方案是放在我的控制器的開頭

skip_before_action :verify_authenticity_token, :only => [:edit, :new]

希望這可以幫助某人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM