Ruby アプリケーションの TCP 接続を介したファイルのダウンロードに関する問題
概要
スタック オーバーフローからアドバイスを受けたため、統合テスト ファイルで機能テストを実施していましたが、ユーザー サインイン テスト セッションを作成しているときに、次のエラーが発生します。
Finished tests in 0.273092s, 3.6618 tests/s, 0.0000 assertions/s.
1) Error:
ListCategoriesTest#test_should_create_category:
NoMethodError: undefined method `[]' for nil:NilClass
app/controllers/session_controller.rb:8:in `create'
test/test_helper.rb:16:in `sign_in_as'
test/integration/list_categories_test.rb:20:in `block in <class:ListCategoriesTest>'
ruby
統合フォルダーの下で私の統合ファイル (list_categories.rb) を見つけてください。
ruby
require 'test_helper'
class ListCategoriesTest < ActionDispatch::IntegrationTest
# test "the truth" do
# assert true
# end
def setup
@category=Category.create(name: "Sports")
# @category2=Category.create(name: "Politics")
@admin_user = User.create(username: "fardeen", email: "[email protected]", password: "fardeen", admin: true)
end
# test "Should show categories listing" do
# get '/categories'
# assert_select "a[href]", category_path(@category) ,{text: @category.name}
# assert_select "a[href]", category_path(@category2),{text: @category2.name}
# end
test "should create category" do
sign_in_as(@admin_user)
assert_difference('Category.count',1) do
post :create, category: { name:"Travel" }
end
assert_redirected_to category_path(Category.last)
end
end
そして、特定のユーザーにサインインするために、テストヘルパー関数のコードとしてサインインを書きました。
ruby
ENV["RAILS_ENV"] ||= "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
class ActiveSupport::TestCase
ActiveRecord::Migration.check_pending!
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
#
# Note: You'll currently still have to declare fixtures explicitly in integration tests
# -- they do not yet inherit this setting
fixtures :all
# Add more helper methods to be used by all tests here...
def sign_in_as(user)
post login_path, params:{ session:{"email"=> user.email, "password"=> "fardeen"} }
end
end
これは私のセッションコントローラーです(SESSIONSではなくSESSION)
ruby
class SessionController < ApplicationController
def new
render 'new'
end
def create
user=User.find_by(email: params[:session][:email].downcase)
if user and user.authenticate(params[:session][:password])
flash[:info]="You have been successfully logged in!!!"
session[:user_id]=user.id
redirect_to user
else
flash[:notice]="Invalid Creds!!!"
render 'new'
end
end
def destroy
session[:user_id]=nil
flash[:info]="You have been logged out!!!"
redirect_to users_path
end
end
なぜ nil パラメーターを渡しているのか、またはセッション ハッシュが post リクエストを通過できないのかがわかりません。
次のようなパラメータを送信するためにさまざまな形式を試しました:
ruby
post login_path, "session"=>{"email"=> user.email, "password"=> "fardeen"}
または
ruby
post login_path, params:{}, session:{"email"=> user.email, "password"=> "fardeen"}
しかし、それらはどれも機能せず、このエラーを次のようにする人もいます
ruby
1) Error:
ListCategoriesTest#test_should_create_category:
ArgumentError: bad argument (expected URI object or URI string)
test/integration/list_categories_test.rb:22:in `block (2 levels) in <class:ListCategoriesTest>'
test/integration/list_categories_test.rb:21:in `block in <class:ListCategoriesTest>'
ruby
ListCategoriesTest: test_should_create_category
-----------------------------------------------
[1m[36m (1.0ms)[0m [1mSAVEPOINT active_record_1[0m
[1m[35mCategory Exists (0.0ms)[0m SELECT 1 AS one FROM "categories" WHERE "categories"."name" = 'Sports' LIMIT 1
[1m[36mSQL (28.1ms)[0m [1mINSERT INTO "categories" ("created_at", "name", "updated_at") VALUES (?, ?, ?)[0m [["created_at", Sat, 19 Aug 2023 15:30:44 UTC +00:00], ["name", "Sports"], ["updated_at", Sat, 19 Aug 2023 15:30:44 UTC +00:00]]
[1m[35m (0.0ms)[0m RELEASE SAVEPOINT active_record_1
[1m[36m (0.0ms)[0m [1mSAVEPOINT active_record_1[0m
[1m[35m (0.0ms)[0m ROLLBACK TO SAVEPOINT active_record_1
Started POST "/login" for 127.0.0.1 at 2023-08-19 21:00:44 +0530
Processing by SessionController#create as HTML
Parameters: {"params"=>{"session"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}}}
Completed 500 Internal Server Error in 41ms
[1m[36m (3.0ms)[0m [1mrollback transaction[0m
私も試してみました:
ruby
def sign_in_as(user)
post login_path, { session: { email: user.email, password: "fardeen" } }
end
ruby
Started POST "/login" for 127.0.0.1 at 2023-08-21 22:14:59 +0530
Processing by SessionController#create as HTML
Parameters: {"session"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}}
[1m[35mUser Load (0.0ms)[0m SELECT "users".* FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1
Rendered users/_footer.html.erb (0.0ms)
Rendered session/new.html.erb within layouts/application (2.0ms)
Rendered layouts/_messages.html.erb (0.0ms)
Completed 200 OK in 8ms (Views: 6.0ms | ActiveRecord: 0.0ms)
[1m[36m (0.0ms)[0m [1mSELECT COUNT(*) FROM "categories"[0m
[1m[35m (3.0ms)[0m rollback transaction
解決策
Ruby on Rails 4.0 では、post メソッドに異なる構文が使用されていました。の代わりに
def sign_in_as(user)
post login_path, params:{ session:{"email"=> user.email, "password"=> "fardeen"} }
end
使用
def sign_in_as(user)
post login_path, { session: { email: user.email, password: "fardeen" } }
end
ところで、Ruby on Rails 4.0 は 9 年以上前に開発され、6 年前にサポートが終了しました。セキュリティの問題を回避し、現在のドキュメント、記事、チュートリアルに従い、最新の gem を使用できるようにするために、Rails バージョンを最新バージョンに更新することを強くお勧めします。