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フレームワークを簡単に紹介する.
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とデータベースのインタラクティブロジックです.ここでテストしたデータはデータベースに実際に保存され、データベースから取り出されているからです.利点:一度に方法全体をテストし、方法の信頼性と欠点を保証する:コードが結合しすぎて、シミュレーションデータの上で仕事量が大きい
テストが必要な主体、ユニットテストの粒度をよく考えてこそ、丈夫で信頼できるユニットテストを書くことができます.