Saya mencoba untuk menegaskan persamaan dua System.Drawing.Size
struktur, dan saya mendapatkan pengecualian format daripada kegagalan pernyataan yang diharapkan.
[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);
}
Apakah ini perilaku yang dimaksudkan? Apakah saya melakukan sesuatu yang salah di sini?
Assert.AreEqual(struct1, struct2, string.Format("Failed expected {0} actually is {1}
sudahkah Anda mencoba memiliki , struct1.ToString (), struct2.ToString ())) `?Jawaban:
Aku memahaminya. Dan ya, itu bug.
Masalahnya adalah ada dua tingkat yang
string.Format
terjadi di sini.Itu pertama tingkat format adalah sesuatu seperti:
Kemudian kami menggunakan
string.Format
dengan parameter yang Anda berikan:(Jelas ada budaya yang disediakan, dan beberapa jenis sanitasi ... tapi tidak cukup.)
Kelihatannya baik-baik saja - kecuali nilai yang diharapkan dan nilai aktual itu sendiri diakhiri dengan tanda kurung di, setelah diubah menjadi string - yang mereka lakukan
Size
. Misalnya, ukuran pertama Anda akhirnya diubah menjadi:Jadi level kedua dari pemformatan adalah seperti:
... dan itulah yang gagal. Aduh.
Memang, kami dapat membuktikan ini dengan sangat mudah dengan menipu pemformatan untuk menggunakan parameter kami untuk bagian yang diharapkan dan aktual:
Hasilnya adalah:
Jelas rusak, seperti yang tidak kami duga
foo
dan bukan nilai sebenarnyabar
!Pada dasarnya ini seperti serangan injeksi SQL, tetapi dalam konteks yang agak kurang menakutkan
string.Format
.Sebagai solusinya, Anda dapat menggunakan
string.Format
seperti yang disarankan StriplingWarrior. Itu menghindari tingkat kedua pemformatan dilakukan pada hasil pemformatan dengan nilai aktual / yang diharapkan.sumber
%*n
setara? :(Saya pikir Anda telah menemukan bug.
Ini berfungsi (melempar pengecualian assert):
Dan ini berfungsi (mengeluarkan pesan):
Tapi ini tidak berhasil (melempar a
FormatException
):Saya tidak bisa memikirkan alasan apa pun ini akan menjadi perilaku yang diharapkan. Saya akan mengirimkan laporan bug. Sementara itu, berikut solusinya:
sumber
Saya setuju dengan @StriplingWarrior bahwa ini memang tampaknya bug dengan metode Assert.AreEqual () pada setidaknya 2 kelebihan beban. Seperti yang telah ditunjukkan StiplingWarrior, berikut ini gagal;
Saya telah melakukan sedikit percobaan tentang hal ini lebih lanjut untuk menjadi sedikit lebih eksplisit dalam penggunaan kode. Berikut ini juga tidak berhasil;
Dan
Ini membuat saya berpikir. System.Drawing.Size adalah sebuah struct. Bagaimana dengan objek? Daftar param tidak menentukan bahwa daftar setelah
string
pesanparams object[]
. Secara teknis, ya struct adalah objek ... tetapi jenis objek khusus, yaitu, tipe nilai. Saya pikir di sinilah letak bugnya. Jika kita menggunakan objek kita sendiri dengan penggunaan yang sama dan strukturSize
, berikut ini benar-benar tidak bekerja;sumber
class
ataustruct
, tetapi apakahToString
nilainya mengandung tanda kurung kurawal yang terlihat seperti aString.Format
.Saya pikir pernyataan pertama tidak benar.
Gunakan ini sebagai gantinya:
sumber