UserRepository
に依存するUserDomain
をテストしている場合は、インターフェイスにコーディングするのではなく、コンカレント/実装です。これは順番に2つを結合します。結合されたコードとは、のないUserDomain
のテストがないため、単体テスト・コードには難しいという意味です。それはUserRepository
に依存しているよう
public class UserDomain
{
public object GetAllUsers()
{
UserRepository repo = new UserRepository();
var results = repo.GetAllUsers();
// do some stuff like transforming it
return null;
}
}
public class UserRepository
{
public object GetAllUsers()
{
return null; // implementation
}
}
このアプローチでは、コードに問題があなたが本当に「ユニットテスト」UserDomain
、することはできませんです。あなたの例で
は、おそらくこのような何かを持っています。実際のユニットテストを行うためには、実装は実装に依存する必要はなく、インタフェースのような抽象的なものでなければなりません。ユニットテストを達成するために
、あなたのクラスは、より多くのように見えることができます:あなたが見ているものを理解すれば全体の多くは、本当にここに変更されていない
public class UserDomain
{
private readonly IUserRepository _iUserRepository;
public UserDomain(IUserRepository iUserRepository)
{
_iUserRepository = iUserRepository;
}
public object GetAllUsers()
{
var results = _iUserRepository.GetAllUsers();
// do some stuff like transforming it
return null;
}
}
public interface IUserRepository
{
object GetAllUsers();
}
public class UserRepository : IUserRepository
{
public object GetAllUsers()
{
return null;
}
}
注意を。 UserRepository
が実装している新しいインターフェイスIUserRepository
を作成しました。 UserDomain
も、具体的な実装(UserRepository
)を新しくするのではなく、IUserRepository
のインスタンスを使用するように更新されました。
これは、いくつかのことを意味し、UserDomain
はもはやUserRepository
に直接依存している、それは簡単に嘲笑することができ抽象IUserRepository
、に依存していない、スタブ、またはテストのためにテスト機能を提供するために出て偽造。
コンストラクタ内のインターフェイスの実装を渡すという概念は、dependency injectionとして知られています。コンストラクタインジェクションは、依存性インジェクションを実現するための1つの方法ですが、他にも同様です。基本的な考え方は、あるクラスが依存関係を持っていて、その依存関係が文字通りの実装ではなく、インターフェース/コントラクト上にあるべきであるということです。言ったことの全てで
、統合テストは嘲笑、むしろあなたのスタブよりUserDomain
の範囲内UserRepository
のような実際の実装を、使用してテストされ、IUserRepository
を偽造。
2つ以上のユニットが含まれている場合は統合テストです。 – jonrsharpe
あなたの経験に基づいて、ドメイン層で単体テストを作成し、サービス層で統合テストを作成する多くの開発者がいますか?基本的には、返品の減少によりRepo層でユニットテストをスキップしますか? – user6411982
あなたのコード内のロジックをテストするユニットに焦点を当てます。データアクセスレイヤーは、おそらく統合テストを通じてヒットするだけのリーンです –