H 3 BPM Controllersユニットテスト(二)

5252 ワード

  • ユニットテストの範囲

    コードには、一定の依存があることが多い.簡単な業務は、サードパーティサービス、メールサービス、微信サービス、釘サービスなどに依存する可能性があります.1つの機能モジュールがデータベースとインタラクティブになることもあります.では、問題が来ました.あなたのユニットテストの範囲は何ですか.
  • ビジネスコードをテストするだけ
  • データベース、メールサービスなどのサードパーティサービスに対するテスト
  • は、サービスからデータベースおよびサードパーティサービスへの全リンクテスト
  • を行う.

    以下、くだらないことはあまり言わないで、実際のコードを通じていくつかの状況を説明します.
     // 
        public class OrganizationService : ServiceBase
        {
            /// 
            ///  IOrganization, , EF DBSet()。
            /// 
            private IOrganization _organization;
            public IOrganization OrganizationManager
            {
                get
                {
                    if (_organization == null)
                    {
                        _organization = Engine.Organization;
                    }
                    return _organization;
                }
            }
    
            public OrganizationService() { }
    
            /// 
            ///  Moq IOrganization 
            /// 
            /// 
            public OrganizationService(IOrganization organization)
            {
                this._organization = organization;
            }
    
            /// 
            ///  
            /// 
            ///  
            ///  
            public List GetRoleList(UnitType unitType)
            {
                List listRole = new List();
                List listunits = OrganizationManager.GetAllUnits(unitType);
                if (listunits != null && listunits.Count > 0)
                {
                    foreach (OThinker.Organization.Unit u in listunits)
                    {                 
                        // 
                        OrgPost parentPost = OrganizationManager.GetUnit(post.SuperiorID) as OrgPost;
                        listRole.Add(new OrgJobViewModel { });
                    }
                }
                return listRole;
            }
    }
    

    テストが必要なサービス:OrganizationService.OrganizationManager:組織マネージャで、主にデータベースとのインタラクションに使用されます.ビジネスロジックの一部も含まれています.
    GetRoleList:テストされた方法、ユニットテストにテストが必要な方法.このメソッドのビジネスロジックを検証します.
    テストの主体を明確にしてこそ、丈夫で合理的なユニットテストを作成することができます.ここではMoqを用いてサードパーティサービスをMockし,Moqフレームワークを簡単に紹介する.
  • Moqは、依存する外部をシミュレートするためのフレームワークである.
  • 彼は非密封クラス、インタフェース、またはクラスをシミュレートすることができます.
  • 彼はmockを通じて空のクラスを作成することができます.メソッドをオーバーライドするには、Setup()を使用します.
  • 実際のメソッドで呼び出されたパラメータ、または呼び出されたエンティティオブジェクトは、コードによってシミュレーションする必要があります.

  • GetRoleListビジネスロジック
            [TestMethod]
            public void GetRoleList_HasList_Return_List()
            {
                //1  mock 
                Mock mock = new Mock();
                List units =CreateOrgPostList();
                // 2  Mock 
                mock.Setup(m => m.GetAllUnits(UnitType.Post)).Returns(units);
                // It.IsAny()  string
                // (string s) => units.FirstOrDefault(d => d.ObjectID == s)  s ,  units.FirstOrDefault(d => d.ObjectID == s);
                mock.Setup(m => m.GetUnit(It.IsAny())).Returns((string s) => units.FirstOrDefault(d => d.ObjectID == s));
                //3  Mock
                OrganizationService organization = new OrganizationService(mock.Object);
                var list = organization.GetRoleList(UnitType.Post);
                Assert.AreEqual(units.Count, list.Count);
                Assert.AreEqual(units[0].ObjectID, list[0].ObjectID);
            }
    

    我々はMoqフレームワークを通じてIOrganizationをOrganizationServiceに注入し、注目点をGetRoleListのビジネスロジックに焦点を当て、データベースがインタラクティブに成功するかどうかにかかわらず、サードパーティのサービスがスムーズであるかどうかにかかわらず、ビジネスロジックテストが合格し、ユニットテストが合格した.利点:サードパーティに依存しない;コードデカップリング.欠点:データベースインタラクティブサービスに対して、他のユニットのテストオーバーライドが必要
    GetRoleListビジネスロジックおよびデータベースインタラクション
            [TestMethod]
            public void GetRoleList_HasList_Return_List()
            {       
                List units =CreateOrgPostList();
                OrganizationService organization = new OrganizationService();
                // 
                organization .SaveUnits(units);
                var list = organization.GetRoleList(UnitType.Post);
                Assert.AreEqual(units.Count, list.Count);
                Assert.AreEqual(units[0].ObjectID, list[0].ObjectID);
                 // 
                organization .DeleteUnits(units);
            }
    

    このテストポイントはGetRoleListのビジネスロジックとOrganizationServiceとデータベースのインタラクティブロジックです.ここでテストしたデータはデータベースに実際に保存され、データベースから取り出されているからです.利点:一度に方法全体をテストし、方法の信頼性と欠点を保証する:コードが結合しすぎて、シミュレーションデータの上で仕事量が大きい
    テストが必要な主体、ユニットテストの粒度をよく考えてこそ、丈夫で信頼できるユニットテストを書くことができます.
  • ユニットテストの目的

    ユニットテストの主体に基づいて分析するのは、テストのユニット機能が正常であることを保証するためであり、修正後、自動化テストによって機能の信頼性を保証することができる.コードによって、いくつかの重複または煩雑な手動操作を行うことができる.コードのレベルに基づいてコードの正確性を分析する.したがって,セルを分割する際には重要である.上記の例では、OrganizationServiceはユニットであり、機能の完全性と信頼性を検証したり、OrganizationServiceはユニットであり、OrganizationServiceのビジネスロジックを検証したりします.IOrganizationは、データベースインタラクションの信頼性を検証するユニットです.分割されたセル粒度は異なり,試験目的も異なる.
  • ユニットテストのフレームワーク

    私たちが使用しているテストフレームワークはマイクロソフトのMSUNNIT MockフレームワークはMoqリファレンスです:Moq QuickStart MSUNIT