テストコミットは、ガードを使用してRailsで復帰する



TCRとは
TCRはTest && Commit || Revert Kent Beckによって作られたプログラミングワークフローです.
  • 変更点
  • テスト実行
  • テストがパスすると、Git履歴にコミットされます.
  • テストが失敗した場合は、変更された変更が返されます.
  • このワークフローはTest Driven Development サバイバルモードでもオートニングテストを介して高速フィードバックループを仮定すると、テストが失敗すると、変更があなたの下から取り除かれます.私の経験では、あなたはあなたが作っている変更について、違って、非常に意図的に考えるように強制します.私がこれまでに会ったならば、それは痛いです、しかし、良い精神運動.
    TCRでより多くのために、ケントベックはかなりよくこのプロセスを例証しました.このポストの残りのトピックは、このワークフローをRuby on Rails開発者として設定する方法に固有です.

    TCRの使い方
    TCRのワークフローを設定する方法には多くの方法があり、簡単なシェルスクリプトのレシピを提供する初期定義ケントで最も簡潔に記述されています.
    Detect a file change.
    Execute your test command.
    && commit # this chains the commands together and executes the second command (commit) if and only if the prior command (test in our case) exits without error.
    || revert # || is the OR operator. It executes the command on the right only if the command on the left returned an error.
    
    そして、それの美しさは、仕事をすることです!私はこのテンプレートを上記のbashマジックの風味でいくつかの小さなルビー個人プロジェクトに適用しました.すごい!これは、ほとんどそのbashスクリプトがどのように見えたかです.
    fswatch -1 . -e ".*" -i "\\.rb$" | xargs -0 -n1 -I{} bin/test-changes && git commit -a -m "working" && ./tcr.sh || git reset --hard && ./tcr.sh
    
    人生が起こるように、私は本当にそれを最大限に得るために私の毎日の仕事にこのワークフローを取りたいと思った.TCRとTDDの主要な側面は、高速フィードバックループの必要性である私は何年ものRuby on Railsコードで働いています、そして、特定の年齢のどんなモノリスででも、どれくらい威厳があるか、フィードバックループrails test 走ります.数分です.私がレールの上にいたとき、私はもう少し戦略的である必要があることが明らかになりました.

    エージガード
    Guardgem 私はいくつかの経験がありますファイルに変更があった場合などに設定できます.models/user.rb ) この例では関連付けられたテストファイルをautorunします.user_test.rb ). あなたが想像できるように、これはTDDのTCRとTCRの必要な最初の部分のために非常に役に立つ赤または緑のテストを見るまで、時間をかなり減らします.
    しかし、その後トリッキーなビット来るどのようにこれらのテストが合格か失敗の結果の周りの行動を構築するには?
    これは物事が楽しいhackyを取得します.
    私たちはminitestフレームワークを使用するので、私のワークガードのセットアップはguard-minitest plugin . ガードは、プラグインの広い範囲をサポートしていますそれは、私がこの問題を完全にゼロから解決することに比べれば私に訴えたもう一つの理由でした.結局、このワークフローを試してみることができました.
    Guardはまた、ガードファイル内の特定の動作を設定するために使用できるいくつかのコールバック機能を提供します.テスト実行に成功した場合は:run_on_modifications_end イベントが発生しました.すごい!超簡単に、私はちょうど以下を私のGuardfileに加える必要がありました:callback(:run_on_modifications_end) { git commit -a -m "working" }これはTest && Commit 我々のTCRワークフローの部分revert ?
    これは物事が超多彩になるです.
    私が着陸したのは、あなたがmonkey patching ガードファイル内のガードminminestプラグインは、特定の例外をスローし、その例外を処理する際にフックと呼ばれるthrow_on_failed それから、ガードから期待しているものをスローします.今、私は自分のガードファイルに次の行を追加することによって、実装を実装できます.callback(:throw_on_failed) { git checkout . }特定のファイル構成が削除された場合、これは私の不快なガードファイルのようになります.
    今、私はこれが間違って行くことができる多くの方法がある知っているように、これはMEA culpaを考慮してください.The guard documentation was also kind enough to warn me as such . これは、より良いか悪いかのために、レールでTCRへの道を構築する私の最初の試みです.私は私が私の巨大な守護ファイルとこのワークフローでより多くの時間を過ごすので、フォローアップすることができて興奮しています.
    読んでくれてありがとう!

    リファレンスとインスピレーション
    (バンジョー演奏にとどまる)
    つの重要な部分のガード文書creating an inline guard と他のhooks and callbacks . すべてのドキュメントが非常に有用だった!