プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

rspec最低限の定義

  • 2021年1月14日
  • 2021年1月14日
  • Ruby
  • 180view
  • 0件

めちゃくちゃ初歩的な定義、書き方についておさらい

定義の仕方など

RSpec.describe 'テストグループ' do
  describe 'ケース1' do
    it '1 + 2 は 3 になること' do
      expect(1+1).to eq 3
    end
  end
end

rspecはこんな形になっていますので、それぞれの定義の補足を以下で書きます。

describe

require 'rails_helper'

RSpec.describe 'テストグループ' do

railsで書く場合rails_helperが必ず必要。
「describe」はテストのグループを定義。
上記はテストグループのテストですよという宣言になる。

describeには文字列ではなくクラス、メソッドを渡すこともできる。

context

RSpec.describe 'テスト' do
  context 'パラメータが正しいとき' do
    it '完了画面を表示すること' do
   ***
    end
  end
  context 'パラメータが正しくないとき' do
    it '編集画面に戻ること' do
      ***
    end
  end
end

discribeと同じくグループ化を定義するものだが、分岐を伴う場合などにはこちらを使う。使い分けると可読性がよくなる。

it…do…end

it '1+2は3になること' do
 expect(1+2).to eq 3
end

「it」テストひとつの単位。it…do…endでテストケースを書いていく。
これはexampleという単位にまとめられ、テストコードを実行したときなんかに登場する。
例)2 examples, 0 failures, 2 passed

エクスペクテーション

「expect(***).to eq ***」の部分

「expect」は「期待する」
「.to」は「~であること」
「eq」は「等しい」。この部分をマッチャという。

繋げて読んで何をするテストかがわかる。

expect(1+2).to eq 3
expect(1+2).not_to eq 2

「.not_to」は「~でないこと」を定義できる。(to_notでも可)

RSpec.describe 'テストグループ' do
  describe 'ケース1' do
    it '1 + 2 は 3 になること' do
      expect(1+1).to eq 3
    end
  end
  describe 'ケース2' do
    it '2 + 2 は 5ではないこと' do
      expect(2+2).to_not eq 5
    end
  end
end

ここまででこのテストの意味がわかるようになる。
describeはいくつもネストが可能で、最上位のdescribe以外はrspecを省略可能。

before..do..end

前提条件などを定義。

before do
  @params = { name: '田中', sex: 'man'}
end

let

let(:params) { {} }

インスタンス変数「@params」を「let(:params)」のように置き換えることが可能。
letは遅延評価され必要なとこに呼び出されるのが特徴。

RSpec.describe User do
  describe '#greet' do
    let(:user) { User.new(params) }
    let(:params) { { name: 'たろう', age: age } }
    context '12歳以下の場合' do
      let(:age) { 12 }
      it 'ひらがなで答えること' do
        expect(user.greet).to eq 'ぼくはたろうだよ。'
      end
    end
    context '13歳以上の場合' do
      let(:age) { 13 }
      it '漢字で答えること' do
        expect(user.greet).to eq '僕はたろうです。'
      end
    end
  end
end

遅延評価がわかりやすい例

https://qiita.com/jnchito/items/42193d066bd61c740612