मुझे यह मिल गया है। और हाँ, यह एक बग है।
समस्या यह है कि string.Format
के दो स्तर यहां जा रहे हैं।
पहले स्वरूपण का स्तर है कुछ की तरह:
string template = string.Format("Expected: {0}; Actual: {1}; Message: {2}",
expected, actual, message);
फिर हम पैरामीटर आपके द्वारा बताये गये हैं, उनके साथ string.Format
का उपयोग करें:
string finalMessage = string.Format(template, parameters);
(जाहिर है संस्कृतियों प्रदान की जा रही है, और है कुछ स्वच्छता के प्रकार ... लेकिन पर्याप्त नहीं है।)
यह ठीक दिखता है - जब तक अपेक्षित और वास्तविक मान स्वयं स्ट्रिंग में परिवर्तित होने के बाद ब्रेसिज़ के साथ समाप्त नहीं होते हैं - जो वे Size
के लिए करते हैं। उदाहरण के लिए, अपने पहले आकार समाप्त होता है में बदला जा रहा:
{Width=0, Height=0}
तो स्वरूपण के दूसरे स्तर की तरह कुछ है:
string.Format("Expected: {Width=0, Height=0}; Actual: {Width=1, Height=1 }; " +
"Message = Failed expected {0} actually is {1}", struct1, struct2);
... और वह है क्या नाकाम रहने रहा है। आउच।
वास्तव में, हमने स्वरूपण बेवकूफ बनाना उम्मीद है और वास्तविक भागों के लिए हमारे पैरामीटर का उपयोग करने से वास्तव में आसानी से यह साबित कर सकते हैं:
var x = "{0}";
var y = "{1}";
Assert.AreEqual<object>(x, y, "What a surprise!", "foo", "bar");
परिणाम है:
Assert.AreEqual failed. Expected:<foo>. Actual:<bar>. What a surprise!
जाहिर टूट, हम के रूप में foo
की उम्मीद नहीं थी और न ही वास्तविक मूल्य bar
था!
असल में यह एक एसक्यूएल इंजेक्शन हमले की तरह है, लेकिन string.Format
के कम डरावनी संदर्भ में है।
एक कामकाज के रूप में, आप string.Format
का उपयोग कर सकते हैं क्योंकि स्ट्राइप्लिंगवायरियर सुझाव देता है। यह वास्तविक/अपेक्षित मानों के साथ स्वरूपण के परिणामस्वरूप स्वरूपण के दूसरे स्तर से परहेज करता है।
क्या आपने 'Assert.AreEqual (struct1, struct2, string.Format (" असफल होने की उम्मीद {0} वास्तव में {1} ', struct1.ToString(), struct2.ToString()) है?' – DiskJunky
ठीक काम करता है, हालांकि मैं उत्सुक हूं कि क्यों Assert.AreEqual() संरचना प्रकारों के साथ एक स्ट्रिंग को प्रारूपित नहीं कर सकता है। – Kyle
@ किइल जिज्ञासा से बाहर, यह यूनिट परीक्षण फ्रेमवर्क के सिल्वरलाइट संगत संस्करण के साथ नहीं है, क्या यह है ? मैं इसे उन डीएलएल के साथ पुन: उत्पन्न कर सकता हूं (अभी तक पूर्ण .NET फ्रेमवर्क संस्करण की कोशिश नहीं की है) संपादित करें: कभी भी, पूर्ण लोगों के साथ परीक्षण नहीं किया गया और अभी भी असफल रहा। :) –