あなたの要件は「人は常に名前を持つべきです」としましょう。どこから始めることができますか?
まず、明確にする必要があります。私は、あなたが「いつも名前を持つべきです」と言うとき、あなたは名前として「空でない文字列を持つべきではない」ということを意味すると信じています。
私たちが実際に意味することは、「人がデータベースに格納されているときにその名前をnullまたは空にすることはできません」ということです。攻撃の第1の行は、データベースに制約を加えてそれを強制することです。ただし、その制約を取り除く悪質なDBAからあなたを守るものはありません。したがって、システムについて真であると思うものをテストし、変更があった場合には失敗したテストによってフラグが立てられます。この目的のために、 "私のアプリがヌル名を持つPersonをDBに保存すると、DBが悲惨に失敗する"のようなテストを書くでしょう。これは単体テストではなく、より統合的なテストであり、古い古い単体テストよりも書く方が複雑です。
ただし、これは依然として制約を削除し、ヌル名を持つレコードを直接作成する不正なDBAのシナリオをカバーしていません。言い換えれば、あなたのアプリは正しいデータに戻ってくることを信じることができないので、あなたのドメインはヌルネームの人の可能性にどのように対処したいのですか?
非常にリテラルなアプローチは、Personがnull以外のNameでのみ構築できることを強制することができ、それ以外の場合はスローします。それは単体テストと実施を容易にするでしょうが、恐らく開発が苦痛になるでしょう。より快適なアプローチは、Personに制約を設けることではなく、壊れたルールに対してPersonを検証できるValidatorクラスです。これは、あなたがPerson(比喩的)に望む何かを行うことができ、そのPersonが依然として有効な状態にあるかどうかを検証できるので、より美味です。
これは非常に簡単にテスト可能である)
1の利点があります、このようなバリデータのためのユニットテストを作成することは、
2ケーキの一部である)不正なDBAの問題に対処する:あなたが検証できるようになりましたバリデーターを適用することによって、アプリの外部に出入りするものすべて
私は怠惰な開発者であり、これは私が始めるところです。データに関係するものよりもテストがはるかに簡単ですが、問題に対処するため、バリデーターに行ってください。言い換えれば、私は単体テスト(つまり、完全にメモリ)を可能な限り保有し、コード/ドメインでビジネスロジックをできるだけ多く保持する傾向があります。テストしやすくなりました。
ユニットテストではなく、データベースに対してテストする必要があります。 – coreyward
適切な単体テストであるかどうか分からないでください。通常の単体テストとともにデータベースをテストしないという実用的な理由は、スピードです。私はあなたが本物のものをテストすることをお勧めします。はい、テストは遅くなりますが、小規模なプロジェクトではそれほど難しくありません。一方、リリース前の日には、虚偽のインターフェイスを実装することを忘れてしまったという厄介な驚きは得られません。 –