簡體   English   中英

我應該將“自定義單元測試聲明”類設為非靜態嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM