どうしてもprivateメソッドをテストしたいときの小ネタ。
send を利用して、テスト対象クラスのprivateメソッドを呼び出します。
describe "#get_url" do context "When receive valid arguments" doit "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株式会社
目次