LoginSignup
5
0

More than 1 year has passed since last update.

RSpecの書き方(describe/context/it/expect/eq/include)

Last updated at Posted at 2021-12-20

はじめに

  • Rspecを触る機会があったのでわかる範囲でまとめます

  • 今回はとあるページにアクセス可能かをテストする想定で記載しています

  • 2021/12/20:初版

  • 2022/06/23:細かなレイアウト修正

describe/context

request_spec.rb
describe 'アクセス確認' do
  context 'アクセス可能な場合' do
    # 正常にアクセスできること(200)
    # "トップページ"の文言がサクセス先に含まれるか確認
    # リダイレクトされるがアクセスできる(302)
  end

  context 'アクセスできない場合' do
    # 権限がなくてアクセスできない(403)
    # ページが存在しない(404)
  end
end
  • describeでテストを大まかにグループ分け、さらにその中でcontextを使用してグループ内で細かく分けられる

it/expect/eq/include

request_spec.rb
describe 'アクセス確認' do
  context 'アクセス可能な場合' do
    it '正常にアクセスできること(200)' do
      get '/'
      expect(response.status).to eq 200
    end 
    it '「トップページ」の文言がサクセス先に含まれるか確認' do
      get '/'
      expect(response.body).to include 'トップページ'
    end 
    it 'リダイレクトされるがアクセスできる(302)' do
      get '/redirect_page'
      expect(response.status).to eq 302
    end
  end

  context 'アクセスできない場合' do
    it '権限がなくてアクセスできない(403)' do
      get '/my_page'
      expect(response.status).to eq 403
    end
    it 'ページが存在しない(404)' do
      get '/aaa'
      expect(response.status).to eq 404
    end
  end
end
  • itでcontext内のテスト項目を記述する
  • 実行時it単位で結果が返ってくるため、極力it内に複数のテスト観点は記述しないようにする
  • expect(XXX).to eq YYY と記述することで「XXXはYYYと等しくなる」というテスト項目になる
  • expect(XXX).to include YYY と記述することで「XXXはYYYに含まれる」というテスト項目になる
    • ※XXX:取得値 YYY:期待値

実行方法

  • 以下を実行するとテストをフルで実施される(項目数によるが、実行に時間がかかる)
$ bundle exec rake spec

一部のテストだけ実行する

特定のテストファイル(またはディレクトリ)のみを実行する

  • 以下を実行で指定したパスのファイル内のテストのみ実行できる
$ bundle exec rspec spec/request/request_spec.rb
  • ディレクトリごと指定することも可能
$ bundle exec rspec spec/request/

タグとファイル内の一部のテストのみ実行

  • 各テストはdescribe/context/it単位でタグ付けできる
  • 設定したタグごとに実行するテスト項目を選択できる
request_spec.rb
describe 'アクセス確認' do
  context 'アクセス可能な場合' do
    it '正常にアクセスできること(200)',type: accessible do
      get '/'
      expect(response.status).to eq 200
    end 
    it '「トップページ」の文言がサクセス先に含まれるか確認' do
      get '/'
      expect(response.body).to include 'トップページ'
    end 
    it 'リダイレクトされるがアクセスできる(302)' do
      get '/redirect_page'
      expect(response.status).to eq 302
    end
  end

  context 'アクセスできない場合',doing: true do
    it '権限がなくてアクセスできない(403)', do
      get '/my_page'
      expect(response.status).to eq 403
    end
    it 'ページが存在しない(404)' do
      get '/aaa'
      expect(response.status).to eq 404
    end
  end
end
  • 例えば上記のように「正常にアクセスできること(200)」にtype: accessible のタグと「アクセスできない場合」にdoing: trueのタグをつける

  • 「正常にアクセスできること(200)」のテストだけ実行させるのは以下のコマンドは以下となる

$ bundle exec rspec spec/request/request_spec.rb --tag @type:accessible
  • 「アクセスできない場合」のテストだけ実行させるのは以下のコマンドは以下となる
  • タグにboolean型を指定している場合は省略可能
$ bundle exec rspec spec/request/request_spec.rb --tag @doing

参考資料

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0