在.NET(VB或C#)和單元測試使用Microsoft.VisualStudio.TestTools.UnitTesting
:如何修改.NET中單個單元測試中的區域設置小數點分隔符?
如何有效地局部地改變一個單元測試中的區域設置小數分隔以便String.Format("{0:0.0}", aDouble)
(其AFAIK是區域設置相關的)將產生串與修改區域設置?
編輯: 注意:我不問如何輸出文本與特定的語言環境。我在問如何在單元測試中更改區域設置的小數點分隔符以模擬具有不同小數點分隔符的系統中會發生什麼。 我不是從單元測試代碼中調用String.Format,而是從被測試的功能中調用String.Format。
其他信息:
我創造了一個VB .NET庫,我有一個類MyClass
與Encode(...)
功能是寫作,除其他事項外,數字信息爲文本。
該組件將用於不同計算機可能具有「小數分隔符」(逗號或點)的不同配置的環境中。但是,我的組件應該對此不敏感,這意味着它應該始終輸出「point」(例如,在格式化數字時使用System.Globalization.CultureInfo.InvariantCulture
)。
我想編寫一個單元測試,以確保即使系統區域設置小數點分隔符設置爲「逗號」而不是「點」,編碼功能仍將繼續工作。我做了一些研究,像這樣的東西出來了:
Public Sub Encode_CultureWithCommaSeparator_OutputMatchesTemplate() ... Dim oldCulture = Threading.Thread.CurrentThread.CurrentCulture ' A culture that uses "," as decimal separator Threading.Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("es-ES") CompareEncodedToTemplate(...) Threading.Thread.CurrentThread.CurrentCulture = oldCulture End Sub
的CompareEncodedToTemplate
功能將使用MyClass.Encode
方法將信息寫入到MemoryStream
那然後會相比,每行一個模板文本文件線,當他們不相等時,測試將失敗。
我想要「模擬」的是Encode
函數在區域設置具有不同於「point」的小數點分隔符時的運行方式。顯然我的測試功能沒有按照我的預期工作:
我在計算機上運行測試,其中我設置了小數點分隔符,並且測試成功,所以我認爲「我的編碼函數會按我的意願工作,因爲測試通過「。
然後我在計算機上運行測試,並將小數點分隔符設置爲逗號,並且測試失敗。我意識到這是因爲在我的Encode
邏輯中,我錯過了格式化雙精度時使用InvariantCulture
。這意味着我的測試沒有像預期的那樣工作,因爲我應該能夠檢測到第一臺計算機的這種情況(因爲這是我想要創建測試的原因)。
預先感謝您。
一個更多評論:我有單元測試和兩個不同的程序集中的測試功能,如果這可能會有所差異... – racucad
我認爲'Encode_CultureWithCommaSeparator_OutputMatchesTemplate'的主要問題是您構建一個新的CultureInfo實例而不是像這樣從全局集合中訪問正確的文化信息:'System.Globalization.CultureInfo.GetCultureInfo(「es-ES」);' –
好吧,我發現了這個問題,它與我如何設計測試有關類。我在實際改變文化之前實例化了MyClass,並簡化了我的解釋。我說「編碼」函數是用String寫的。格式,但實際上這些數字被轉換爲MyClass中的文本(這是故意的)。不幸的是,問題的本質並沒有在我的問題中得到體現,但我相信格倫費裏和喬納森狄金森是我寫這個問題的正確答案。 J.D的一個更「精心製作」,但G.F是讓我反應的人。 – racucad