আমি এইটা পাইছি. এবং হ্যাঁ, এটি একটি বাগ।
সমস্যাটি হ'ল দুটি স্তর রয়েছে string.Format
চলছে।
প্রথম ফর্ম্যাটিং মাত্রা ভালো কিছু হল:
string template = string.Format("Expected: {0}; Actual: {1}; Message: {2}",
expected, actual, message);
তারপরে আমরা string.Format
সরবরাহিত প্যারামিটারগুলি সহ আমরা ব্যবহার করি :
string finalMessage = string.Format(template, parameters);
(স্পস্টত: ই অনেক সংস্কৃতির প্রদান করা হচ্ছে, এবং কিছু sanitization সাজানোর ... কিন্তু যথেষ্ট নয়।)
এটি দুর্দান্ত দেখাচ্ছে - যদি না প্রত্যাশিত এবং আসল মানগুলি নিজেরাই বন্ধনীতে শেষ হয় তবে স্ট্রিংয়ে রূপান্তরিত হওয়ার পরে - যা তারা করে 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("Failed expected {0} actually is {1}
, স্ট্রাক্ট 1.টিস্ট্রিং (), স্ট্রাক্ট 2.টোস্ট্রিং ()) `?