Assert NUnit.Equals melempar pengecualian "Assert.Equals tidak boleh digunakan untuk pernyataan"

132

Saya baru-baru ini mencoba menggunakan metode Assert.Equals () saat menulis tes NUnit baru. Setelah dieksekusi, metode ini AssertionExceptionmenyatakan bahwa Assert.Equals should not be used for Assertions. ini sedikit membingungkan pada pandangan pertama. Apa yang terjadi di sini?

Odrade
sumber
Bisakah Anda memberi kami beberapa konteks seperti kode tertentu yang ada di dalamnya? Jenis objek apa yang Anda bandingkan, dll?
Mike Parkhill
9
Maaf, tapi saya sudah menemukan jawabannya. Saya hanya memintanya agar saya dapat memposting jawaban untuk anak cucu. Konteksnya tidak terlalu penting, seperti yang akan Anda lihat dengan membaca jawabannya. Saya berharap jawaban ini akan mudah ditemukan melalui pencarian web pada pesan pengecualian.
Odrade

Jawaban:

201

Assertadalah kelas statis yang mewarisi dari System.Object, karena semua kelas dilakukan secara implisit dalam C #. System.Object mengimplementasikan metode berikut:

static bool Equals(object a, object b)

Metode Assert yang dimaksudkan untuk perbandingan kesetaraan adalah Assert.AreEqual() metode. Oleh karena itu, memanggil Object.Equals()metode melalui kelas Assert dalam unit test tentu saja merupakan kesalahan. Untuk mencegah kesalahan ini dan menghindari kebingungan, para pengembang NUnit sengaja menyembunyikan Object.Equalsdi kelas Assert dengan implementasi yang melempar pengecualian. Inilah implementasinya:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

Tentu saja pesan pengecualian itu sendiri membingungkan, tetapi setidaknya itu memberi tahu Anda bahwa Anda telah melakukan sesuatu yang salah.

Odrade
sumber
13
Pesannya membingungkan, tetapi masukkan ke Google dan Anda berakhir di sini di jawaban ini dan semuanya baik-baik saja. Terima kasih Odrade.
Stephen Holt
25
Pengembang NUnit dapat mengubah pesan untuk mengatakan "... gunakan Assert.AreEqual ()".
WillC
Mengapa mereka tidak menjadikan metode Equals pribadi?
shytikov
4
@shytikov Karena itu tidak mungkin. Anda tidak dapat mengganti metode virtual dari kelas dasar dengan yang pribadi.
Odrade
18

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

tidak:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Doug
sumber