Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

長く、乱雑で、テストが不十分なコントローラーをリファクタリングする方法

Railsでのキャリアのある時点で、プログラミングを永遠に諦めたくなるようなコントローラーに遭遇します。機能全体のコードのすべての行が含まれる場合があります。 15個のbefore_filtersがある可能性があります すべてがインスタンス変数を介して通信し、特定の順序で呼び出す必要があります。そうしないと、問題が発生します。そして、必然的に、そのテストは次のようになります:

test "index" do
  get :index
  assert_response :success
end

素晴らしい。 100%のテストカバレッジですよね?

目を閉じて存在しないふりをするのは素晴らしいことですが、いつかこれらのコントローラーの1つのバグを修正する必要があります。そして、優れたソフトウェア開発者であるあなたは、自分が見つけたよりも良いコードを残したいと思っています。

しかし、特に信頼できる適切なテストがない場合、どのようにリファクタリングできますか?

テストする(どういうわけか)

リファクタリング中に安全であると感じるには、適切なテストが必要ですが、書くことはできません。 このコードに対する適切なテストまで リファクタリングします。では、何ができるでしょうか?

コントローラーがどれほどひどく書かれていても、コントローラーにデータを送信し、コントローラーからの応答を期待する統合テストを作成することができます。今のところ、コントローラーが存在することを確認するテストを作成する必要があります 動作は変わらない リファクタリングしながら。

これらのテストは、単体テストほど焦点が絞られていません。しかし、これらの高レベルのテストにより、これから行うリファクタリングがすべてを壊すことはないという安心感を得ることができます。そして、それらを書くプロセスは、コードをよりよく理解するのに役立ち、コードをリファクタリングする方法を決定するのに役立ちます。

依存関係を解消する

悪いコントローラーコードを悪くするものは何ですか?ほとんどの場合、それは暗黙の依存関係です before_filtersの間 、ヘルパーメソッド、または200行関数のさまざまな部分。また、リファクタリングが早すぎる場合もあります。コードを改善するには、これらの依存関係を解消する必要があります。

Railsコントローラーの場合、依存関係を解消する簡単な方法があります。 before_filtersからコードをコピーするだけです 、ヘルパーメソッド、スーパークラス、およびその他のコントローラー風のコードが隠れている可能性があります。次に、それらのメソッドの呼び出しを、コピーしたコードに置き換えます。

コードの乾燥を一時的に解除しているため、後でより理解しやすい方法でコードをリファクタリングできます。 醜いですが、今ではすべてのコードが公開されています。どの部分が相互作用し、すべてがどのように流れるかを確認できるはずです。

(このプロセス中は、すべての変更の後にテストを実行して、インライン化が何も壊れていないことを確認する必要があります。)

テスト可能なコードに向けてリファクタリング

これで、コードをリファクタリングする準備が整いました。おそらく、基本的な抽出方法に固執するでしょう。 、オブジェクトの抽出プルアップ方法 -タイプのリファクタリング。いくつかの異なる方法でコードをリファクタリングしてみて、何が最も良いと感じるかを確認してください。

最初の数パスでは、セーフティネットとして高レベルの統合テストを信頼できます。しかし、すぐに、もっと良いものが必要になるでしょう。

リファクタリングするときは、コードをよりテストしやすくする機会を探してください。 これは通常、テストダブルを注入する場所を作成し、オブジェクト間の依存関係を減らし、コントローラーを簡単に作成して単体テストできるオブジェクトに依存させることを意味します。コードをテスト可能なオブジェクトに移動することで、コントローラーが小さくなり、理解しやすくなり、テストしやすくなります。

番号付きリストの形式で入手できますか?

繰り返しになりますが、大規模なコントローラーを分解するための手順は次のとおりです。

  1. コントローラーに対して実行される高レベルの統合テストを取得します。
  2. テストを実行し、合格することを確認します。
  3. インラインbefore_filters 、スーパークラスメソッド、およびコードを隠すその他の抽象化。
  4. テストを実行し、それでも合格することを確認します。
  5. リファクタリングを実行します(抽出メソッド抽出サービスオブジェクトインスタンス変数をローカルに置き換えます など)。コードの感触が良いかどうかを確認してください。
  6. テストを実行し、それでも合格することを確認します。
  7. コードを抽出したばかりの場合は、抽出したオブジェクトまたはメソッドに対して単体テストを記述します。
  8. テストを実行し、それでも合格することを確認します。
  9. それでもコントローラーの作業が必要な場合は、手順5に戻ります。

次は何ですか?

詳細を知りたい場合は、レガシーコードを効果的に使用することは、テストなしで保守不可能なコードを取得し、それを操作可能なものに変えることのバイブルです。 強くお勧めします 、巨大なモノリシックコントローラーに頻繁に直面している場合(そしてリファクタリングが私と同じくらい楽しい場合)

では、ホラーストーリーを聞いてみましょう! これまでに取り組んだ中で最悪のコントローラーコードはどのようなものでしたか?


  1. ミニテストの仕組みの簡単な分析

    ミニテストとは何ですか? MinitestはRubyテストライブラリです 、コードTDDスタイルのテストを作成できます。 これは、Rails&DHHのお気に入りのデフォルトのテストフレームワークです。 一部の人々は、その単純さと、主要な代替手段(RSpec)と比較してコードが少ないことからそれを好みます。 この写真でわかるように : さて、この投稿は、どちらを選ぶべきか、どちらが「より良い」かについてではありません。 この投稿は、ミニテストの仕組みに関するものです。 。 疑問に思っている場合:一番好きな方を使用してください。ただし、両方に精通している必要があります🙂

  2. コントローラーをキーボードにマップする方法

    コントローラーを PC に接続すると、自動的に検出されます。また、ボタンは Windows 10 によって事前に構成および検出されるため、キーを再度マッピングする必要はありません。一部のゲームでは、この構成が機能しない場合があります。したがって、コントローラーをキーボードに割り当てるには、コントローラーからキーボードへのマッパー設定を使用できます。この記事は、コントローラーをキーボードにマッピングするのに役立ちます。 コントローラをキーボードにマッピングする方法 コントローラーの各キーの機能は、ゲーム設定で確認できます。多くのゲーマーは、キーボード コントロールでゲームをプレイするのが