2

実装の詳細は使用しないように言われました。依存関係は実装の詳細のようです。しかし、私はそれを行動として表現することもできました。

例:LinkListは、そのリンクを格納するためにストレージエンジンに依存しています(例:LinkStorageInterface)。コンストラクターは、そのジョブを実行するために、実装されたLinkStorageInterfaceのインスタンスを渡す必要があります。「shouldUseLinkStorage」とは言えません。しかし、多分私は「shouldStoreLinksInStorage」と言うことができます。

この場合、「テスト」するのに正しいことは何ですか?リンクをストア(動作)に保存することをテストする必要がありますか、それともまったくテストしないでください。

4

2 に答える 2

4

依存関係自体は予期される動作ではありませんが、依存関係で呼び出されるアクションは確実にそうです。あなた (呼び出し元) が知っていることをテストし、SUT の内部動作についての詳細な知識を必要とするものをテストすることは避けてください。

例を少し拡張して、LinkStorageInterface に次の定義 (疑似コード) があると想像してみましょう。

Interface LinkStorageInterface

  void WriteListToPersistentMedium(LinkList list)

End Interface

ここで、あなた (呼び出し元) がそのインターフェイスの具体的な実装を提供しているため、 でメソッドWriteListToPersistentMedium()を呼び出したときに呼び出されることをテストすることは完全に合理的です。Save()LinkList

疑似コードを使用すると、テストは次のようになります。

void ShouldSaveLinkListToPersistentMedium()

  define da = new MockLinkListStorage()  
  define list = new LinkList(da)

  list.Save()

  Assert.Method(da.WriteListToPersistentMedium).WasCalledWith(list)

end method

SUT またはモックの実装固有の詳細をテストせずに、期待される動作をテストしました。テストを(ほとんど)避けたいのは、次のようなものです。

  1. メソッドが呼び出された順序
  2. メソッドまたはプロパティを公開して、確認できるようにする
  3. テストしている予想される動作に直接関係しないもの

繰り返しになりますが、依存関係は、クラスのコンシューマーとして提供するものであるため、使用されることを期待しています。そうでなければ、そもそもその依存関係を持つ意味がありません。

于 2009-08-11T21:40:55.207 に答える
1

LinkStorageInterface は実装の詳細ではありません。その名前は、エンジンへのインターフェースを示唆しています。その場合、名前shouldUseLinkStorageはshouldStoreLinksInStorageよりも価値があります。

それは私の 2 ペニーの価値です !

于 2009-08-11T21:29:02.327 に答える