मुझे मिलगया। और हाँ, यह एक बग है।
समस्या यह है कि यहां पर दो स्तर 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!
मूल रूप से यह एक SQL इंजेक्शन हमले की तरह है, लेकिन इसके बजाय कम डरावने संदर्भ में है string.Format।
वर्कअराउंड के रूप में, आप string.Formatस्ट्रिपलिंगवर्यर के सुझाव के रूप में उपयोग कर सकते हैं । यह वास्तविक / अपेक्षित मूल्यों के साथ स्वरूपण के परिणाम पर किए जा रहे स्वरूपण के दूसरे स्तर से बचा जाता है।
Assert.AreEqual(struct1, struct2, string.Format("Failed expected {0} actually is {1}, struct1.ToString (), struct2.ToString ())) `?