2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rspecの自分流書き方

Last updated at Posted at 2024-12-30

はじめに

rspecの書き方がいつも迷うのでまとめる。
まだまだ、随時編集を継続していく予定。

describeの書き方

テストケースを説明するような書き方もあるけど、メソッド名だけをシンプルに書くほうが何をテストしてるのかがすぐにわかる。
逆に、何のテストを書いてないのかもすぐにわかる。

参考
https://shinkufencer.hateblo.jp/entry/2018/10/24/233000

インスタンスメソッドの場合

sample.rb
describe "#method_name" do
end

クラスメソッドの場合

sample.rb
describe ".method_name" do
end

コントローラー

リクエストスペックで書く。
ポイントは以下の通り。

ポイント

  • response.statusを必ず確認する
  • 画面に表示された内容や取得した情報が正しく表示されているかテストする場合、response.bodyに期待する内容が含まれているかを確認する

参考
https://qiita.com/t2kojima/items/ad7a8ade9e7a99fb4384

scopeの場合

sample.rb
  describe "test" do
    subject { SbGuaranteeExam.test }

    context "含まれる場合" do
      let!(:test) { build_stubbed :test }

      it "検索される" do
        is_expected.to include test
      end
    end

    context "含まれない場合" do
      let!(:test) { build_stubbed :test }

      it "検索されない" do
        is_expected.not_to include test
      end
    end
  end

ポイント

  • describeはスコープ名だけ書く。シャープやコンマは書かなくて良い
  • テストケースは、検索されるor検索されないの2ケースのみ設定でOK
  • subjectを使う(まだ検討中、、、)

モデルのメソッドの場合

sample.rb
  describe ".test_method" do
    context "該当する場合" do
      let(:test) { build_stubbed :test }
      it "有効である" do
        expect(test.test_method).to be_valid
      end
    end
  end

ポイント

sample.rb
# 下記のような定義だと、build_stubbed使っても関連データが保存されてしまう
FactoryGirl.define do
  factory :test do
    hoge { create(:huga) }
  end
end

# 下記の書き方なら、build_stubbedを使った時、関連データが保存されない
FactoryGirl.define do
  factory :test do
    association :hoge, factory: :huga
  end
end

  • subjectを使わない。(まだ検討中、、、)

デコレーターの場合

sample.rb
  describe "#test_method" do
    context "の場合" do
      let!(:test) { build :test }

      it "hogeが表示される" do
        expect(test.test_method).to eq "hoge"
      end
    end

    context "の場合" do
      let!(:test) { build :test }

      it "hugaが表示される" do
        expect(test.test_method).to eq "huga"
      end
    end
  end

ポイント

  • 可能ならばbuild_stubbedやbildを使う
  • subjectを使わない。(まだ検討中、、、)

モックを使い、メソッドが呼び出されたかテストする場合

インスタンスメソッドの場合
sample.rb
before {
  test = Test.new
  allow(test).to receive(:test_method)
}

# 呼び出されたかテスト
expect(test).to have_received(:test_method).once
# 呼び出されていないかテスト
expect(test).not_to have_received(:test_method).once

クラスメソッドの場合
sample.rb
before {
  allow(Test).to receive(:test_method)
}

# 呼び出されたかテスト
expect(Test).to have_received(:test_method).once
# 呼び出されていないかテスト
expect(Test).not_to have_received(:test_method)

モックした時に特定の値を返すようにする
sample.rb
before {
  allow(Test).to receive(:test_method).and_return(nil)
}

テストケースごとにテストデータの値を変更したい時

sample.rb
  describe "#test_method" do
    let(:test) { build :test, hoge: huga }

    context "hugaがtrueの場合" do
      let!(:huga) { true }

      it "hogeが表示される" do
        expect(test.test_method).to eq "hoge"
      end
    end

    context "hugaがfalseの場合" do
      let!(:huga) { false }

      it "hugaが表示される" do
        expect(test.test_method).to eq "huga"
      end
    end
  end
2
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?