RubyではテストしやすくするためにDIを使わない

結論

Rubyでは、動的にクラスに生えているメソッドを書き換えられるため、テスタビリティを上げるためにDIを使わない。

個人的にはストラテジーパターン使いたいときぐらいしか、DI使わないんじゃないかなーって思っている。

Rubyでテスタビリティ向上のためにDIを使わない理由

DIを使う理由は、結合度の低下、テスタビリティの向上が主な理由だと思います。

一般的な言語の場合には、引数にインターフェースを指定して、インターフェースに依存するようにすることでテスト時にモックオブジェクトを注入できるようにすると思います。しかし、Rubyの場合には、動的にクラスに生えているメソッドを書き換えれるためテスタビリティを上げるためにDIをするのは意味がないです。

Rubyでは、rspecを用いて下記のように書くだけでクラスのメソッドを書き換えることができます。これによりテスト実行時にはクラスのメソッドの内容が変わった状態でテストが実行されます。Rubyのこの柔軟性により、テストを容易にするためにDIを行うという行為は意味がなくなります。

before do
  google_drive_session = class_double(GoogleDrive::Session).as_stubbed_const(transfer_nested_constants: true)

  session = instance_double('session')


  allow(google_drive_session).to receive(:from_service_account_key).and_return(session)
end

RubyでDIを使う局面

Rubyを使ってDIを使うとしたら、それはストラテジーパターンを使用したいときぐらいだろうと思ってます。

最近言語周りで思っていること

特定の言語には、特定の言語の流儀があるので、それに従おう。
一般論とか、別の言語の流儀の知識だけで、考えずに突き進むのはやめよう。

参考サイト

Dependency injection is not a virtue

コメント

このブログの人気の投稿

単一責任の原則についてのまとめ

文字列が適切か考える