最新のユーザー インターフェイス、特に MacOS と iOS には、多くの「カジュアルな」アニメーションがあります。これらのビューは、主にシステムによって調整された短いアニメーション シーケンスを通じて表示されます。
[[myNewView animator] setFrame: rect]
場合によっては、アニメーション グループと完了ブロックを含む、もう少し精巧なアニメーションを作成することもあります。
さて、次のようなバグ レポートを想像できます。
ちょっと -- myNewView が表示されたときの素敵なアニメーションは、新しいリリースでは発生していません!
したがって、単体テストでいくつかの簡単なことを行う必要があります。
- アニメーションが発生することを確認する
- アニメーションの長さを確認する
- アニメーションのフレームレートを確認する
しかしもちろん、これらすべてのテストは簡単に記述できなければならず、コードを悪化させてはなりません。テスト主導の複雑さで暗黙のアニメーションの単純さを台無しにしたくありません!
では、カジュアル アニメーションのテストを実装するための TDD に適したアプローチとは何でしょうか?
単体テストの正当化
単体テストが必要な理由を説明するために、具体的な例を見てみましょう。多数の WidgetView を含むビューがあるとします。ユーザーがダブルクリックして新しいウィジェットを作成すると、最初は小さくて透明に見え、アニメーション中にフルサイズに拡大するはずです。
さて、システムの動作を単体テストする必要がないことは事実です。しかし、私たちが物事を汚したためにうまくいかないかもしれないことがいくつかあります:
アニメーションが間違ったスレッドで呼び出され、描画されません。しかし、アニメーションの過程で setNeedsDisplay を呼び出すため、最終的にウィジェットが描画されます。
破棄された WidgetControllers のプールから、使用されていないウィジェットをリサイクルしています。NEW WidgetViews は最初は透明ですが、リサイクル プールの一部のビューはまだ不透明です。だからフェードは起こりません。
アニメーションが終了する前に、新しいウィジェットでいくつかの追加のアニメーションが開始されます。その結果、ウィジェットが表示され始め、落ち着く前に短い間隔で点滅し始めます。
ウィジェットの drawRect: メソッドに変更を加えましたが、新しい drawRect は低速です。昔のアニメは良かったのに今はめちゃくちゃ。
これらはすべて、サポート ログに「ウィジェットの作成アニメーションが機能しなくなりました」と表示されます。私の経験では、一度アニメーションに慣れると、関係のない変更によってアニメーションが壊れていることに開発者がすぐに気付くのは非常に困難です。それが単体テストのレシピですよね?