テストしたい次の関数があるとします。
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
_emailService.SendEmail(order.User.Email, "Your order has been cancelled!");
}
現在、Order クラスは SubSonic で生成されたクラスであり、その User プロパティは遅延ロードされています。つまり、order.User.Email を呼び出すと、実際に SQL ステートメントを実行して User をフェッチします。
これを単体テストしたい場合、単体テストがデータベースにヒットすることを本当に望んでいないため、問題が発生します。
私の現在の解決策は、 CancelOrder 関数を次のようにリファクタリングすることです。
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
User user = _userRepository.GetByUserID(order.UserID);
_emailService.SendEmail(user.Email, "Your order has been cancelled!");
}
次に、_userRepository.GetUserByID() 呼び出しをスタブ化して、ハードコーディングされた User オブジェクトを返すことができます。
これはこれを行うための最良の方法ですか?すべてのデータ アクセスは、プロパティ内に隠されるのではなく、リポジトリを介して行われるため、2 番目の実装の方がクリーンであると主張できると思います。