[英]Should I make my Custom Unit Test Assert Class Non-Static?
我使用內置的Visual Studio單元測試工具針對CRM 2011執行單元測試。許多測試都在斷言一個實體的創建。
Assert.IsNull(service.GetFirstOrDefault<Contact>(contact.Id));
(GetFirstOrDefault是一種擴展方法,它嘗試通過id從CRM檢索聯系人,如果找不到,則返回null)
我想創建自己的Assert方法,其操作如下:
CrmAssert.Exists(service, contact);
起初,我認為從Assert
繼承是個好主意,但是,這是一個靜態類。 然后,我創建了一個新的靜態類,如下所示:
public static class AssertCrm
{
public static void Exists<T>(IOrganizationService service, T entity) where T : Entity
{
Exists(service, entity, null, null);
}
public static void Exists<T>(IOrganizationService service, T entity, string message) where T : Entity
{
Exists(service, entity, message, null);
}
public static void Exists<T>(IOrganizationService service, T entity, string message, params object[] parameters) where T: Entity
{
if (service.GetFirstOrDefault<T>(entity.Id) == null)
{
throw new AssertFailedException(message == null ? String.Format(message, parameters));
}
}
}
這樣稱呼:
AssertCrm.Exists(service, contact);
很好,除了我真的應該能夠一次設置服務,而不必每次都調用它:
AssertCrm.Service = service;
AssertCrm.Exists(contact);
AssertCrm.Exists(campaign);
AssertCrm.Exists(etc...);
但是我相信Visual Studio會嘗試運行多線程的測試,這意味着當我設置Service
靜態屬性時,它可能會在不同的測試中被其他服務覆蓋(以及IOrganizationService
不是線程安全的)。
我是否需要使我的AssertCrm類成為非靜態類,所以不必擔心多線程處理? 我缺少一種更簡單的技術嗎?
您可以將AssertCrm設為單例,然后實例化一次,所有其他調用將使用同一實例。
我個人更喜歡使用內置斷言庫的第一種選擇。 我看不到嘗試將其包裝在擴展方法或“幫助程序”中有什么好處。
如果您真的想走這條路,則可以在IOrganizationService
上創建一組擴展方法,以消除繼續傳遞它的需要。這使它更IOrganizationService
,但我仍然贊成第一個。
crmService.AssertExists(contact);
順便說一句,為什么要在“單元”測試中創建一個真正的CRM實例? 在測試中針對模擬IOrganizationService
進行驗證的過程更快,更易於維護。
經過一些額外的研究,我沒有發現它應該(必須)為靜態類的任何原因,並因此將其創建為非靜態類。
給其他想做類似事情的人的便條:為所有實例方法創建靜態方法重載,因為ClassName.AssertMethod()
與new ClassName().AssertMethod()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.