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

  • CHISTOSITOJAJA

    CHISTOSITOJA

    27 HAZİRAN 2010
  • LounaTutorials

    LounaTutoria

    10 EYLÜL 2009
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008