Neden bu yapılar karşılaştırırken biçim bir istisna iddia atıyor?
System.Drawing.Size
iki yapı arasındaki eşitliği savunmak için çalışıyorum, ve beklendiği iddia başarısızlık yerine biçim bir durum alıyorum.
[TestMethod]
public void AssertStructs()
{
var struct1 = new Size(0, 0);
var struct2 = new Size(1, 1);
//This throws a format exception, "System.FormatException: Input string was not in a correct format."
Assert.AreEqual(struct1, struct2, "Failed. Expected {0}, actually it is {1}", struct1, struct2);
//This assert fails properly, "Failed. Expected {Width=0, Height=0}, actually it is {Width=1, Height=1}".
Assert.AreEqual(struct1, struct2, "Failed. Expected " struct1 ", actually it is " struct2);
}
Bu amaçlanan bir davranış mı? Yanlış bir şey yapıyor buradayım?
CEVAP
Anladım. Ve evet, bir hata var.
Sorun string.Format
iki seviyeli dönüyor.
ilkbiçimlendirme düzeyi gibi bir şey:
string template = string.Format("Expected: {0}; Actual: {1}; Message: {2}",
expected, actual, message);
Daha sonra temin ettiğiniz parametreleri ile string.Format
kullanıyoruz:
string finalMessage = string.Format(template, parameters);
(Kültürler var açıkçası sağlanırken, vebazıtemizleme nevi... ama yeterli değil.)
Bu beklenen ve gerçek kendilerini ayraçları ile sona değerleri sürece iyi görünüyor -, Size
için yaptıkları bir dize dönüştürülür sonra. Örneğin, ilk boyutu için dönüştürülen biter:
{Width=0, Height=0}
Biçimlendirme ikinci seviye gibi bir şey yani:
string.Format("Expected: {Width=0, Height=0}; Actual: {Width=1, Height=1 }; "
"Message = Failed expected {0} actually is {1}", struct1, struct2);
... ve başarısız oldunuz. Ah.
Aslında, bu gerçekten kolay beklenen ve gerçek parçaları için parametreleri kullanmak için biçimlendirme kandırıyorsun tarafından ispat edebiliriz:
var x = "{0}";
var y = "{1}";
Assert.AreEqual<object>(x, y, "What a surprise!", "foo", "bar");
Sonuç:
Assert.AreEqual failed. Expected:<foo>. Actual:<bar>. What a surprise!
foo
beklemiyorduk ne de gerçek değeri bar
olduğu açıkça kırılmış!
Temelde bu string.Format
daha az korkutucu bağlamında SQL enjeksiyon saldırısı gibi, ama.
Geçici bir çözüm olarak, StriplingWarrior anlaşılacağı gibi string.Format
kullanabilirsiniz. Bu biçimlendirme, ikinci düzey gerçek/beklenen değerler ile biçimlendirme sonucu gerçekleştirilen önler.
Neden değişken yapılar“”? kötü...
Neden ve C bir istisna catch yeniden o...
Neden basit bir beşgen kullanmaktır bi...
Özel durum açıklaması ve yığın bir ist...
Neden NSİnteger bir değişken uzun biçi...