2016-06-16 3 views
-1

単位テストでは、アプリケーションの最小単位をテストします。そのため、GetAllUsers()メソッドをテストするためにUserRepositoryに対してユニットテストを書くことができます。ユニットテストはどの時点で統合テストになりますか?

単位テストをUserDomainに対して記述して、GetAllUsers()メソッドをテストすることもできます。 UserDomainはUserRepositoryを呼び出すので、UserDomainテストは統合テストと見なされますか?

また、バックエンドにAPIを提供するサービス層がある場合は、UserDomainテストを単体テストと見なしますか?

+0

2つ以上のユニットが含まれている場合は統合テストです。 – jonrsharpe

+0

あなたの経験に基づいて、ドメイン層で単体テストを作成し、サービス層で統合テストを作成する多くの開発者がいますか?基本的には、返品の減少によりRepo層でユニットテストをスキップしますか? – user6411982

+0

あなたのコード内のロジックをテストするユニットに焦点を当てます。データアクセスレイヤーは、おそらく統合テストを通じてヒットするだけのリーンです –

答えて

0

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を偽造。

関連する問題