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のスコープで定義を行えば、同等の結果が得られるので、すっきりとした印象のテストができる