SORU
19 ŞUBAT 2013, Salı


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
19 ŞUBAT 2013, Salı


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.Formatkullanabilirsiniz. Bu biçimlendirme, ikinci düzey gerçek/beklenen değerler ile biçimlendirme sonucu gerçekleştirilen önler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • mist64

    mist64

    30 Mayıs 2006
  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012