【Rspec】 privateメソッドのテスト

Categories:Ruby

どうしてもprivateメソッドをテストしたいときの小ネタ。

send を利用して、テスト対象クラスのprivateメソッドを呼び出します。

  describe "#get_url" do
    context "When receive valid arguments" do
      it "Return url" do
        expect(CallApiService.send(:get_url, is_https: true)).to eq \
          "https://example.com"
      end
    end

#sendは、Objectクラスに実装されている組み込みメソッドです。ここではObjectクラスを継承するCallApiServiceクラスのget_urlメソッドを、is_https: trueという引数を伴って呼び出しています。

ただし、そもそもテストが必要になるほどprivateメソッドでの処理を「複雑怪奇」にするのは原則として良くないプラクティスです。

どうしてもprivateメソッドをテストしたいというのであれば、まずコードの方をもっと小さなクラスに分割してから、それらを個別にテストすることを検討しましょう。このような事態を避ける最良の方法は、メソッドを設計するときに「単一責任の原則」を用いることです。

Rails tips: RSpecのテスト設計でよくあるやらかし4種(翻訳)|TechRacho by BPS株式会社

参考

返信がありません

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です