【rails6】모델 단위 테스트 에러 ActiveRecord::StatementInvalid: Mysql2::Error: MySQL client is not connected
오늘은 응용 프로그램의 모델 단위 테스트 코드에서 오류 해결에 대해 씁니다.
오류 내용
ActiveRecord::StatementInvalid: Mysql2::Error: MySQL client is not connected
오류 화면은 다음과 같습니다.
% bundle exec rspec spec/models/comment_spec.rb
Comment
記事へのコメント機能
コメントが投稿できるとき
フォームに正しく入力すれば投稿できる
コメントが投稿できないとき
コメントが空欄では投稿できない (FAILED - 1)
ユーザーid(user_id)が空では投稿できない (FAILED - 2)
記事id(article_id)が空では投稿できない (FAILED - 3)
Failures:
1) Comment 記事へのコメント機能 コメントが投稿できないとき コメントが空欄では投稿できない
Failure/Error: _query(sql, @query_options.merge(options))
ActiveRecord::StatementInvalid:
Mysql2::Error::ConnectionError: Lost connection to MySQL server during query
# 見にくくなるので省略 #
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
# ------------------
# --- Caused by: ---
# Mysql2::Error::ConnectionError:
# Lost connection to MySQL server during query
# /Users/私の名前/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query'
조사하면 원인은 다음 두 가지로 좁혀지는 것입니다.
・MySQL server의 정지, 재기동이 원인으로 지금까지 사용하고 있던 network socket 를 사용할 수 없게 되었다
· SQL이 read_timeout 이내에 실행이 끝나지 않았습니다.
참조원
htps : // 아비 cky. 네 t/2017/09/17/014241/
... 감사합니다! !
내 실행 파일은 줄 수가 적기 때문에 모두 binding.pry를 넣어 보려고합니다.
spec/models/comment_spec.rbRSpec.describe Comment, type: :model do
before do
@user = FactoryBot.create(:user)
@article = FactoryBot.create(:article)
@comment_user = FactoryBot.create(:user)
@comment = FactoryBot.build(:comment, user_id: @comment_user.id, article_id: @article.id)
end
describe '記事へのコメント機能' do
context 'コメントが投稿できるとき' do
it 'フォームに正しく入力すれば投稿できる' do
expect(@comment).to be_valid
end
end
context 'コメントが投稿できないとき' do
it 'コメントが空欄では投稿できない' do
@comment.comment = ''
@comment.valid?
binding.pry
expect(@comment.errors.full_messages).to include('Commentを入力してください')
end
it 'ユーザーid(user_id)が空では投稿できない' do
@comment.user_id = nil
@comment.valid?
binding.pry
expect(@comment.errors.full_messages).to include('Userを入力してください')
end
it '記事id(article_id)が空では投稿できない' do
@comment.article_id = nil
@comment.valid?
binding.pry
expect(@comment.errors.full_messages).to include('Articleを入力してください')
end
end
end
end
% bundle exec rspec spec/models/comment_spec.rb
Comment
記事へのコメント機能
コメントが投稿できるとき
フォームに正しく入力すれば投稿できる
コメントが投稿できないとき
From: /Users/私/projects/アプリ/spec/models/comment_spec.rb:22 :
17:
18: context 'コメントが投稿できないとき' do
19: it 'コメントが空欄では投稿できない' do
20: @comment.comment = ''
21: @comment.valid?
=> 22: binding.pry
23: expect(@comment.errors.full_messages).to include('Commentを入力してください')
24: end
25: it 'ユーザーid(user_id)が空では投稿できない' do
26: @comment.user_id = nil
27: @comment.valid?
[1] pry(#<RSpec::ExampleGroups::Comment::Nested::Nested_2>)> exit
コメントが空欄では投稿できない
From: /Users/私/projects/アプリ/spec/models/comment_spec.rb:28 :
23: expect(@comment.errors.full_messages).to include('Commentを入力してください')
24: end
25: it 'ユーザーid(user_id)が空では投稿できない' do
26: @comment.user_id = nil
27: @comment.valid?
=> 28: binding.pry
29: expect(@comment.errors.full_messages).to include('Userを入力してください')
30: end
31: it '記事id(article_id)が空では投稿できない' do
32: @comment.article_id = nil
33: @comment.valid?
[1] pry(#<RSpec::ExampleGroups::Comment::Nested::Nested_2>)> exit
ユーザーid(user_id)が空では投稿できない
From: /Users/私/projects/アプリ/spec/models/comment_spec.rb:34 :
29: expect(@comment.errors.full_messages).to include('Userを入力してください')
30: end
31: it '記事id(article_id)が空では投稿できない' do
32: @comment.article_id = nil
33: @comment.valid?
=> 34: binding.pry
35: expect(@comment.errors.full_messages).to include('Articleを入力してください')
36: end
37: end
38: end
39: end
[1] pry(#<RSpec::ExampleGroups::Comment::Nested::Nested_2>)> exit
記事id(article_id)が空では投稿できない
Finished in 4.98 seconds (files took 1.31 seconds to load)
4 examples, 0 failures
문제없이 통과했습니다!
binding.pry를 삭제하고,
before do 안을 다시 씁니다.
spec/models/comment_spec.rbRSpec.describe Comment, type: :model do
before do
@user = FactoryBot.create(:user)
@article = FactoryBot.create(:article)
@comment_user = FactoryBot.create(:user)
@comment = FactoryBot.build(:comment, user_id: @comment_user.id, article_id: @article.id)
sleep(0.1) # ここを追加
end
# 以下の文章は binding.pry のみを削除してください。それ以外は何も変更しません
그럼… 막상 터미널에서 실행! !
% bundle exec rspec spec/models/comment_spec.rb
Comment
記事へのコメント機能
コメントが投稿できるとき
フォームに正しく入力すれば投稿できる
コメントが投稿できないとき
コメントが空欄では投稿できない
ユーザーid(user_id)が空では投稿できない
記事id(article_id)が空では投稿できない
Finished in 0.50371 seconds (files took 1.31 seconds to load)
4 examples, 0 failures
문제없이 끝낼 수 있었습니다~
이 sleep(0.1)입니다만,
인수에 초 수를 전달하여 초 수 분 처리를 중지할 수 있습니다.
ms(밀리초)의 경우는 상기와 같이 인수에 (0.1)이나 (0.01)라고 기재하면 OK입니다.
이번은 연속적인 처리로, 「SQL 가 read_timeout 이내에 시간에 맞지 않았다」라고 추측합니다
하나의 처리가 끝나면 0.1초 휴식시켜 다음의 처리를 시킨다
그런 이미지를 가지고 있으면 좋지 않을까요? ?
여러분도 해결할 수 있었습니까?
글쎄, 난 앞으로 나아갈거야
Reference
이 문제에 관하여(【rails6】모델 단위 테스트 에러 ActiveRecord::StatementInvalid: Mysql2::Error: MySQL client is not connected), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takapon21/items/eccfbd3a15ef4f354e13
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
% bundle exec rspec spec/models/comment_spec.rb
Comment
記事へのコメント機能
コメントが投稿できるとき
フォームに正しく入力すれば投稿できる
コメントが投稿できないとき
コメントが空欄では投稿できない (FAILED - 1)
ユーザーid(user_id)が空では投稿できない (FAILED - 2)
記事id(article_id)が空では投稿できない (FAILED - 3)
Failures:
1) Comment 記事へのコメント機能 コメントが投稿できないとき コメントが空欄では投稿できない
Failure/Error: _query(sql, @query_options.merge(options))
ActiveRecord::StatementInvalid:
Mysql2::Error::ConnectionError: Lost connection to MySQL server during query
# 見にくくなるので省略 #
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
# ------------------
# --- Caused by: ---
# Mysql2::Error::ConnectionError:
# Lost connection to MySQL server during query
# /Users/私の名前/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query'
RSpec.describe Comment, type: :model do
before do
@user = FactoryBot.create(:user)
@article = FactoryBot.create(:article)
@comment_user = FactoryBot.create(:user)
@comment = FactoryBot.build(:comment, user_id: @comment_user.id, article_id: @article.id)
end
describe '記事へのコメント機能' do
context 'コメントが投稿できるとき' do
it 'フォームに正しく入力すれば投稿できる' do
expect(@comment).to be_valid
end
end
context 'コメントが投稿できないとき' do
it 'コメントが空欄では投稿できない' do
@comment.comment = ''
@comment.valid?
binding.pry
expect(@comment.errors.full_messages).to include('Commentを入力してください')
end
it 'ユーザーid(user_id)が空では投稿できない' do
@comment.user_id = nil
@comment.valid?
binding.pry
expect(@comment.errors.full_messages).to include('Userを入力してください')
end
it '記事id(article_id)が空では投稿できない' do
@comment.article_id = nil
@comment.valid?
binding.pry
expect(@comment.errors.full_messages).to include('Articleを入力してください')
end
end
end
end
% bundle exec rspec spec/models/comment_spec.rb
Comment
記事へのコメント機能
コメントが投稿できるとき
フォームに正しく入力すれば投稿できる
コメントが投稿できないとき
From: /Users/私/projects/アプリ/spec/models/comment_spec.rb:22 :
17:
18: context 'コメントが投稿できないとき' do
19: it 'コメントが空欄では投稿できない' do
20: @comment.comment = ''
21: @comment.valid?
=> 22: binding.pry
23: expect(@comment.errors.full_messages).to include('Commentを入力してください')
24: end
25: it 'ユーザーid(user_id)が空では投稿できない' do
26: @comment.user_id = nil
27: @comment.valid?
[1] pry(#<RSpec::ExampleGroups::Comment::Nested::Nested_2>)> exit
コメントが空欄では投稿できない
From: /Users/私/projects/アプリ/spec/models/comment_spec.rb:28 :
23: expect(@comment.errors.full_messages).to include('Commentを入力してください')
24: end
25: it 'ユーザーid(user_id)が空では投稿できない' do
26: @comment.user_id = nil
27: @comment.valid?
=> 28: binding.pry
29: expect(@comment.errors.full_messages).to include('Userを入力してください')
30: end
31: it '記事id(article_id)が空では投稿できない' do
32: @comment.article_id = nil
33: @comment.valid?
[1] pry(#<RSpec::ExampleGroups::Comment::Nested::Nested_2>)> exit
ユーザーid(user_id)が空では投稿できない
From: /Users/私/projects/アプリ/spec/models/comment_spec.rb:34 :
29: expect(@comment.errors.full_messages).to include('Userを入力してください')
30: end
31: it '記事id(article_id)が空では投稿できない' do
32: @comment.article_id = nil
33: @comment.valid?
=> 34: binding.pry
35: expect(@comment.errors.full_messages).to include('Articleを入力してください')
36: end
37: end
38: end
39: end
[1] pry(#<RSpec::ExampleGroups::Comment::Nested::Nested_2>)> exit
記事id(article_id)が空では投稿できない
Finished in 4.98 seconds (files took 1.31 seconds to load)
4 examples, 0 failures
RSpec.describe Comment, type: :model do
before do
@user = FactoryBot.create(:user)
@article = FactoryBot.create(:article)
@comment_user = FactoryBot.create(:user)
@comment = FactoryBot.build(:comment, user_id: @comment_user.id, article_id: @article.id)
sleep(0.1) # ここを追加
end
# 以下の文章は binding.pry のみを削除してください。それ以外は何も変更しません
% bundle exec rspec spec/models/comment_spec.rb
Comment
記事へのコメント機能
コメントが投稿できるとき
フォームに正しく入力すれば投稿できる
コメントが投稿できないとき
コメントが空欄では投稿できない
ユーザーid(user_id)が空では投稿できない
記事id(article_id)が空では投稿できない
Finished in 0.50371 seconds (files took 1.31 seconds to load)
4 examples, 0 failures
Reference
이 문제에 관하여(【rails6】모델 단위 테스트 에러 ActiveRecord::StatementInvalid: Mysql2::Error: MySQL client is not connected), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takapon21/items/eccfbd3a15ef4f354e13텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)