

Rspecを用いてテストコードを書いているのですが、複数のitで同じexpectを使用するのでどこかに定義してそれをメソッドのように各itに定義して使いたいのです。  
思ったような記事が見つからず困っています。  
開発の現場ではこのような場合どのようにdryにしているのか気になります。

下記の `expect(テストしたい値).to eq 1` が何度も登場して `expect(テストしたい値).to eq 2`
というように今後どんどん増えるので定義場所を一か所にして記述時の負担と見落としを減らしたいと考えています。

詳しい方、教えていただきたいです。お願いいたします。

[code]

    it '権限Aで値が返る' do
      expect(テストしたい値).to eq 1
    end
    
    it '権限Bで値が返る' do
      expect(テストしたい値).to eq 1
    end
    
    it '権限Cで値が返る' do
      expect(テストしたい値).to eq 1
    end
    
[/code]


CC BY-SA 4.0
2022-12-18T09:48:25.460
92868
2022-12-18T10:53:44.030
22565
question
ruby-on-rails ruby rspec
Rspecのexpectメソッドを使い回したい


shared_examples を使えば共通化は出来ますが記述量が減るかどうかは微妙ですね  
テストはあえてDRYにしないやり方の方が扱いやすい場合が多いと思います

[code]

    describe do
      shared_examples "value is 1" do
        it do
          expect(expected).to eq 1
        end
      end
    
      context do
        let(:expected) { 1 }
        include_examples "value is 1"
      end
    
      context do
        let(:expected) { 1 }
        include_examples "value is 1"
      end
    end
    
[/code]


CC BY-SA 4.0
2022-12-18T10:21:58.823
92871
2022-12-18T10:21:58.823
15380
92868
answer


要件に合うかどうかわかりませんが、[rspec-parameterized](https://github.com/tomykaira/rspec-
parameterized) gem というのを使うと次のように書けます。

[code]

    describe do
      where(:condition, :expected) do
        [
          ['a', 1],
          ['b', 2],
          ['c', 3],
        ]
      end
      with_them do
        it do
          expect(hoge(condition)).to eq expected
        end
      end
    end
    # expect(hoge('a')).to eq 1
    # expect(hoge('b')).to eq 2
    # expect(hoge('c')).to eq 3
    # と同じ
    
[/code]


CC BY-SA 4.0
2022-12-18T10:53:44.030
92874
2022-12-18T10:53:44.030
3249
92868
answer