web-dev-qa-db-ja.com

「追加」機能の最初のテストの書き方

良い質問のタイトルを見つけるのに問題があったので、それを自由に改善してください。

エンティティコンポーネントシステム をC++で実装したいのですが、初めてTDDを使用したいと思います。ターゲットの「アーキテクチャ」がすでに指定されている場合、TDDがどれほど役立つか疑問に思いますが、とにかく試してみたいと思います。私の問題はTDDの問題のほうが多く、別の状況でも問題が発生する可能性があります。

最初のテストでは、ComponentEntitysのセットを「所有」する必要があるため、EntityComponentを追加できるかどうかを確認することになっていた(おそらくこれは悪いテストであり、問​​題はすでにここにありますか?)。これまでのところコードは存在せず、私は1つではないかもしれないジレンマに直面しています。私はこれを行うテストを書くことができます:

Entity e;
Component c;
e.add(c);

しかし、addが正しく機能したことをどのように主張すればよいでしょうか?遅かれ早かれ、ある種のhas_componentメソッドが必要になることはわかっていますが、今は追加機能を実装するべきではありませんか、それともすべきですか?また、Entityのパブリックインターフェイスにリストタイプを設定し、それをテストで使用して、後で「離れて」リファクタリングすることもできます。

ここでの正しいアプローチは何ですか? TDDに対する私の考え方は完全にずれているかもしれないので、どんな入力にも感謝しています!

4
InvisiblePanda

あなたの最初のテストは良いスタートです。エラーチェックについて考えてみてください。addからのリターンコードがあり、それが機能したかどうかを示していますか?それとも、何か問題が発生した場合に例外をスローすることになっていますか?

推奨されるアプローチ

Entityクラスにはメソッドhas_component()が必要であることを知っているので、それをクラス定義に追加するだけで、常にfalse(および大きなコメント_// TO DO !!_)。

次のテストは次のようになります。

_assert(! e.has_component(c) ); 
e.add(c);
assert(e.has_component(c)); // or return FAIL to your test framework.  
_

principle は、両方の関数が正しくなるまでテストが失敗することです。

代替案は何ですか

  • number_of_components()などのより単純なメンバーを使用して、正しい方向に進んでいることを確認します(つまり、新しいコンポーネントを追加すると数が増え、同じコンポーネントを2回追加しても数は変わりません)。
  • テストコードにEntityの内部を検査させます。このアプローチはカプセル化のルールを破るので、私は好きではありません。
  • aを作成します テストdouble は、has_component()のエミュレート/シミュレーションされた答えを提供します。それは非常に複雑な機能でしょうか、これが進むべき道です。しかし、ここのような単純な機能の場合、これはやり過ぎかもしれません。
  • 呼び出しをEntityからComponentsに転送するディスパッチ関数がある場合は、それを使用してcが反応するかどうかを確認できます。
4
Christophe