微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

运行集成测试用例 rails 时不执行 before_action 回调

如何解决运行集成测试用例 rails 时不执行 before_action 回调

使用 ruby​​ 2.6.5,Rails 6.0.3.7

在开发服务器中运行项目时,有 before_action 过滤器可以正常工作。但是在运行 rails 应用程序的集成测试时。 回调不执行,请求直接进入被调用函数,而不是先进入 before 动作。

这里附上我的控制器和集成测试用例以及错误输出。 控制器

class TvSeriesController < ApplicationController
  before_action :check_file,only: [:create,:tv_seriel_comments]

  require 'roo'

  def index
    @tv_series = TvSeriel.includes(:comments).all
  end

  def show
    @series = TvSeriel.includes({ comments: [:user] }).find(params[:id])
  end

  def create
    spreadsheet = Roo::Spreadsheet.open(params[:file])
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |line|
      row = HashWithindifferentAccess[[header,spreadsheet.row(line)].transpose]
      tv_serial = TvSeriel.new
      tv_serial.name = row['TV Series']
      tv_serial.genre = row["Genre"]
      tv_serial.seasons = row["No of seasons"]
      tv_serial.release_date = row["Date of First Release"]
      tv_serial.director = row["Director"]
      tv_serial.actor = row["Actor"]
      tv_serial.shoot_location = row["Shoot location"]
      tv_serial.country = row["Country"]
      tv_serial.save
    end
    flash[:notice] = 'TV series uploaded!'
    redirect_back(fallback_location: tv_series_index_path)
  end

  def tv_seriel_comments
    spreadsheet = Roo::Spreadsheet.open(params[:file])
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |line|
      row = HashWithindifferentAccess[[header,spreadsheet.row(line)].transpose]
      comment = Comment.new
      user = User.find_by_name(row["User"])
      comment.user = user
      tv_serial = TvSeriel.find_by_name(row['TV Series'])
      comment.tv_seriel = tv_serial
      comment.stars = row['Stars']
      comment.review = row['Review']
      comment.save
    end
    flash[:notice] = 'TV series comment uploaded!'
    redirect_back(fallback_location: tv_series_index_path)
  end

  def destroy
    TvSeriel.find(params[:id]).destroy
    flash[:notice] = 'TV series removed success!'
    redirect_back(fallback_location: tv_series_index_path)
  end

  def search_actor
    @tv_series = TvSeriel.includes(:comments).where("actor like ?","%#{params[:actor]}%")
    render 'tv_series/index'
  end

  ## check if uploaded file is a cvs
  def check_file
    unless params[:file].blank?
      if params[:file].content_type.eql?("text/csv")
      else
        flash[:alert] = "file format Invalid,expected: text/csv Got #{params[:file].content_type}"
        redirect_back(fallback_location: :tv_series_index_path)
      end
    else
      flash[:alert] = 'Please provide a file to be uploaded !'
    end
  end
end

集成测试:

require 'test_helper'

class UserFlowsTest < Actiondispatch::IntegrationTest
  fixtures :all
  include Devise::Test::IntegrationHelpers
  include Warden::Test::Helpers

  test 'Get list of all users' do
    @user = users(:vidur)
    sign_in(@user)
    get "/users"
    assert_response :success
    assert_select "h2","User List"
  end

  test 'Update Series' do
    @user = users(:vidur)
    sign_in(@user)
    post '/tv_series'
    assert_response :success
  end

end

错误

# Running:

E

Error:
UserFlowsTest#test_Update_Series:
TypeError: no implicit conversion of nil into String
    app/controllers/tv_series_controller.rb:15:in `create'
    test/integration/user_flows_test.rb:19:in `block in <class:UserFlowsTest>'

这里 before_action 过滤器不执行,请求直接进入定义的动作,任何主体都可以给出为什么只运行测试的原因,以及如何纠正它,提前致谢。 这是完整代码的 git 存储库:https://github.com/vidurpunj/sopra_test

解决方法

这是因为您没有 file 参数。

所以您的 check_file 正在使用这部分:

flash[:alert] = 'Please provide a file to be uploaded !'

并且由于您不渲染或重定向,因此控制器操作被正常调用。有关详细信息,请参阅 Rails documentation on filters

如果“before”过滤器呈现或重定向,操作将不会运行

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。