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

どうしても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株式会社
目次

参考

最新情報をチェックしよう!