【rails6】모델 단위 테스트 에러 ActiveRecord::StatementInvalid: Mysql2::Error: MySQL client is not connected

11460 단어 Rails6루비Rails
안녕하세요! 프로그래밍 초학자입니다!
오늘은 응용 프로그램의 모델 단위 테스트 코드에서 오류 해결에 대해 씁니다.

오류 내용



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.rb
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

문제없이 통과했습니다!
binding.pry를 삭제하고,
before do 안을 다시 씁니다.

spec/models/comment_spec.rb
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

문제없이 끝낼 수 있었습니다~

이 sleep(0.1)입니다만,
인수에 초 수를 전달하여 초 수 분 처리를 중지할 수 있습니다.
ms(밀리초)의 경우는 상기와 같이 인수에 (0.1)이나 (0.01)라고 기재하면 OK입니다.
이번은 연속적인 처리로, 「SQL 가 read_timeout 이내에 시간에 맞지 않았다」라고 추측합니다

하나의 처리가 끝나면 0.1초 휴식시켜 다음의 처리를 시킨다
그런 이미지를 가지고 있으면 좋지 않을까요? ?

여러분도 해결할 수 있었습니까?
글쎄, 난 앞으로 나아갈거야

좋은 웹페이지 즐겨찾기