2017-10-18 73 views
1

目前我正在爲CustomControl開發UnitTest。在此控件中有一些代碼,只有在DesignTime中未調用被調用的方法時纔會執行該代碼。當我運行測試時,給定的代碼不會執行,因爲當前上下文似乎是DesignTime。調試測試時跳出DesignTime

例子:

public void SomeMethod() // EDIT: this is the OnLoaded Event for example. 
{ 
    if(IsNotInDesignMode()) // This is implemented somewhere else. 
    { 
     // I want this to be called in the Test Execution. 
     DoSomething(); 
    } 
} 

編輯: 好像我第一次嘗試wasnt不夠清楚,所以這裏的另一種描述。

有沒有辦法告訴我的測試方法/類運行測試作爲運行時版本?我不想更改我的CustomControl中的屬性或方法。而且我沒有熟悉Method IsNotInDesignMode()(例如通過模擬它),因爲它是在外部庫中實現的。

編輯2:看代碼。

感謝您的幫助。

+0

你不能「跳出設計時間」。您的用戶控件要麼在設計器中顯示,要麼在運行時顯示。解釋你究竟想要做什麼,並詳細說明「跳出設計時間」的含義。回答這個問題需要更多的上下文。如果你的意思是你想讓屬性'IsNotInDesignMode'在單元測試控件的時候獲得一定的值,那麼創建一個構造函數參數來設置這個屬性,或者直接從你的單元測試中分配它。 – CodeCaster

+0

我知道你可能不瞭解我的問題。但爲什麼你把它標記爲重複?您阻止其他用戶打開我的問題並嘗試給出答案。您提供的鏈接是完全不同的問題。 – Febertson

+0

您給出的問題描述由副本回答:您只能_detect_,而不是_change_設計時間 - 它是隻讀屬性。所以如果你想讓你的真正問題得到解決,請閱讀[問]和[編輯]你的問題,以便實際回答問題,我很樂意重新開放。 – CodeCaster

回答

2

看起來您已將業務邏輯與視圖邏輯混合在一起。沒有理由單元測試GUI。

我建議你將自己的業務邏輯封裝到自己的類中。然後從視圖中調用特定的操作。

一旦完成,您的單元測試可以直接測試業務邏輯而不處理設計時間。

+0

感謝這第一種方法,但方法中沒有業務邏輯。例如,SomeMethod可能是LoadedEvent。我不能把我的東西放到構造函數或其他地方,因爲我需要的值沒有設置在那裏。 – Febertson

+0

@Febertson使用正確的MVVM,您應該可以爲視圖和視圖模型分別創建項目。單元測試甚至不應該引用視圖項目,因爲他們只需要viewmodel和BLL。 – grek40

+0

我明白你在說什麼。但我有一個控件,它有一個新的Property來生成動態子元素。這是我想測試的功能。在我的測試中創建控件。設置新的屬性,看看孩子是否正確創建。這個功能純粹在UI方面。 也許這不應該或不能用UnitTests測試。這就是我現在正在評估的東西。 – Febertson