投稿

9月, 2019の投稿を表示しています

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)endRubyでDIを使う局面Rubyを使ってDIを使うとしたら、それはストラテジーパターンを使用したいときぐらいだろうと思ってます。最近言語周りで思っていること特定の言語には、特定の言語の流儀があるので、それに従おう。
一般論とか、別の言語の流儀の知識だけで、考えずに突き進むのはやめよう。参考サイトDependency injection is not a virtue