expect(x).to eq y 【rspec】【完全初心者用記事】

エクスペクテーションの式の記法について悩んだことがありましたので共有します。

 

expect.(x).to eq y

上記のような式の場合、

x : テストコード内で生成された値

y : 実際のコントローラやモデルなどで生成される値

の認識でいましたがこれは大きな間違いだったようです。

 

そもそものエクスペクテーションの文法について考えてみます。

xの部分に入れた式の値がYの部分の値と等しければ、テストが成功します」

要は、xとyが等しけりゃ(この場合はeqマッチャ なので)OK 〜ってことです。

 

 

なぜこの疑問が浮かんだかも備忘録的に残しておきます。

 

・x:テストの値 y:実際の値の場合(Userモデルのテストコード)

require 'rails_helper'
describe User do
  describe '#create' do
    it "is invalid without a nickname" do
     user = build(:user)
     user.valid?
     expect(user.errors[:nickname]).to include("can't be blank")
    end
  end
end

 

・x:実際の値 y:テストの値(Tweetsコントローラー、editアクションのテストコード)

describe 'GET #edit' do
    it "assigns the requested tweet to @tweet" do
      tweet = create(:tweet)
      get :edit, params: { id: tweet }
      expect(assigns(:tweet)).to eq tweet
    end

    it "renders the :edit template" do
    end
  end


また、コントローラのテストの

assignsメソッドは基本的にexpectメソッドの引数に使われるのでこの形をとるそう。

コントローラでインスタンス変数のテストコードを書く際はこの記法は重要なので覚えておくといいかもです。