2011-03-21 24 views
3

在我正在測試的應用程序中,我想確保對某些輸入記錄器被調用。一些方法有不同的可能的記錄器消息(例如「值格式錯誤」,「值超出範圍」)。因此,我想確保記錄器被正確的消息調用。如何使用正確的可本地化格式化字符串來調用記錄器的單元測試?

自動存檔的記錄器字符串在RESX中,可能在將來進行本地化。此外,措辭可能會改變。因此,只要與硬編碼的字符串進行比較,只要文本發生變化就可能導致相關測試中斷。由於它們是可本地化的,這意味着我將不得不迫使單元測試在特定文化下執行,或者有更好的方法嗎?

使之複雜化,RESX字符串實際上並不像上面那樣簡單,而是形式爲"Line {0}: Value '{1}' at column {2} is malformed."然後將其用作string.Format()的輸入以生成"Line 12: Value '12a.45' at column 45 is malformed.",例如。這是記錄器實際得到的字符串。我應該將這個字符串硬編碼到單元測試中嗎?

編輯:

我會嘗試一些更詳細的解釋,有非常簡化的方法來說明我的意思:

public void ConvertSomething(object value) 
{ 
    if (/* Check if valid value */) 
    { 
     var convertedValue = /* Some conversion */ ; 
     if (/* Check is in range */) 
     { 
      // Do something 
     } 
     else 
     { 
      Logger.Log(string.Format(Resources.OutOfRange, LineNumber, convertedValue)); 
     } 
    } 
    else 
    { 
     Logger.Log(string.Format(Resources.InvalidValue, LineNumber, value, ColumnNumber)); 
    } 
} 

如何測試記錄器被稱爲與正確的信息?我不能簡單地檢查是否有任何對記錄器的調用。如果我給它一個有效但超出範圍的值,但是有效性檢查有一個錯誤,它會調用記錄器,但帶有「無效值」的消息,實際上應該是「超出範圍」。

我可以模擬記錄器,所以我可以看到它被調用,參數是什麼。但是我應該堅持什麼?

+0

我認爲這是一個整合,甚至是QA水平測試。我甚至不確定如何讓機器以可靠的方式交換語言。 – 2011-03-21 11:21:38

回答

3

如果文化存在於機器上,您可以更改代碼中當前的線程文化。如果它不存在,則需要安裝/創建它。

至於比較應用程序中使用的字符串(可能會改變),我會建議不要做那個測試的目標。

相反,也許在靜態的每個資源中都有一個理智的測試字符串,並對其進行測試。如果這種變化與文化,那麼你已經加載了正確的資源,並可以安全地假設其餘的內容也是正確的。

NUnit的支持不斷變化的測試工具的文化:

http://www.nunit.org/index.php?p=culture&r=2.4.8

更新:我看到那麼這個問題是測試不能直視的記錄?我建議你可以模擬一個記錄器,而不是知道它正在測試幷包含它自己的斷言,或者放棄測試記錄器本身並測試當前正在文化變化中加載的附屬程序集。如果記錄器只是使用資源文件,那麼.NET運行時將處理正確文件的加載或默認爲基本文化文件。

然後,您可以單獨進行測試,以顯示記錄器記錄日誌,而不用擔心它記錄的內容,因爲它在另一個測試中涉及。

更新2:我想我明白你在做什麼。是否有可能讓記錄器接受字符串格式和params object[] args以在使用特定值插入字符串之前訪問字符串?

另外,是否有可能使字符串是靜態的還是通過本質改變每次測試運行?如果測試本身負責首先對值進行排序,那麼對於測試來說,在它們中使用硬編碼的值是有效的。此外,就文化而言,我將分別將這些更改解決爲由不同代碼路徑選擇不同消息引入的更改。

更新3:對不起,我看不到樹木。測試本身可以從代碼使用的resx文件中構建預期的字符串 - 並插入硬編碼值。這依賴於測試輸出與每次運行沒有不同。

如果resx發生變化,那麼只要插入格式化字符串的值的數量不變,就不需要修復代碼或測試。

+0

問題是,我已經有了SUT在錯誤的執行路徑下發生錯誤信息的情況。我給它一個超出範圍(但是有效)的值,但它被記錄爲「格式不正確」。測試是綠色的(因爲記錄器被調用),但是信息是錯誤的,所以它應該是紅色的。 – 2011-03-21 11:27:05

+0

我有一個假記錄器,在那裏我可以看到叫什麼(以及什麼參數)。但是,記錄器在第45列中得到''第12行:值'12a.45'的格式不正確。「例如,它是由包含佔位符的RESX字符串生成的,該字符串包含string.Format()。我應該在測試中硬編碼結果字符串嗎?或者,還有更好的方法? – 2011-03-21 11:36:53

+0

還有一種更好的方法,讓它記錄一種測試值,這種測試值會因文化的不同而有所不同,但最重要的是它不會從創建時開始變化,因此測試可以保持靜態。如果單元測試在代碼中產生差異,那麼管理文化是完全有效的。我的理解是你沒有測試字符串,你正在測試記錄器是否傾聽文化。 – 2011-03-21 11:38:43

0

您創建一個假記錄器,並監視它的代碼在需要時調用它。

+0

我已經有一個假記錄器,可以看到它被調用。但是,我在測試方法中對記錄器有不同的可能調用,並且要確保正在對記錄器進行正確的調用。 – 2011-03-21 11:31:55

+0

然後執行假冒所以它攔截那些特殊情況,所以你可以對它們進行斷言。 – Morten 2011-03-21 11:37:25

相關問題