indilog

Ruby/Rails/React/Goなどに関して自分が勉強したことなどを投稿しています

Model周りのRSpecを書く時に意識していること

正しい方法かはわからないけど、最近Model周りのテストコードを書いていて自分でしっくりくるような書き方を考え出したのでつらつらと書いていきたい

テストコードの基本形

あるModel内のインスタンスメソッドをテストする場合の基本形としては、このような形になってくる

describe '#instance_method' do
  subject { instance.instance_method }

  context 'when first context' do
    let(:instance) { build(:factory_for_first_context) }

    it { is_expected.to ... }
  end

  context 'when second context' do
    let(:instance) { build(:factory_for_second_context) }

    it { is_expected.to ... }
  end
end

意識している箇所

1. describeの直下の行にはsubjectを置く

describe '#instance_method' do
  subject { instance.instance_method }

このようにdescribeでテストしたいメソッドを記述し、その下に今回のテスト対象をsubjectと利用して定義する

2. contextでそのコンテキストに合致したinstanceを定義

  context 'when first context' do
    let(:instance) { build(:factory_for_first_context) }

contextで条件を記述しつつ、それに対応したinstanceをなかで定義することにより、その下の

    it { is_expected.to ... }

でsubjectが評価される時に、contextのスコープで定義したinstanceが採用されるようになる 別のコンテキストでテストしたい時も同じようにそのcontextのスコープで定義を行えば、同等の結果が得られるので、すっきりとした印象のテストができる