Pernyataan menteri gagal saat diperiksa

Setiap kali saya mencoba untuk menegaskan_sama dengan dua objek, saya selalu mendapatkan kesalahan seperti ini:

   No visible difference in the User#inspect output.
   You should look at the implementation of #== on User or its members.

Hal ini juga terjadi pada Time dan Array. Dokumen minitest juga tidak banyak bicara mengenai hal ini.

Saya menggunakan Ruby 2.0.0, tapi saya menggunakan 2.2.0 dan hal yang sama terjadi. Menggunakan minitest terbaru juga.

Juga, saya menjalankan Ubuntu 14.10.


person Fabian Silva    schedule 24.02.2015    source sumber
comment
Apakah ini benar-benar terjadi pada semua objek, sudahkah Anda mencoba membandingkan hal-hal mendasar seperti bilangan bulat? Bisakah Anda memberi kami beberapa contoh?   -  person Jesper    schedule 24.02.2015
comment
Apakah Anda menggunakan difftool khusus?   -  person Jesper    schedule 24.02.2015
comment
Ini sebenarnya hanya terjadi untuk Waktu, Array, dan objek khusus yang saya buat, seperti kelas Pengguna. Saya tidak menggunakan alat khusus apa pun. Contoh: result = @service.run result.must_equal(@users.get_single(1)) Catatan: Saya juga sudah mencoba menegaskan_equal, dan hal yang sama terjadi   -  person Fabian Silva    schedule 24.02.2015


Jawaban (4)


Tentang pesan itu

Pesan ini, yang bukan merupakan kesalahan, ditampilkan ketika pernyataan gagal, tetapi MiniTest gagal menemukan perbedaan antar objek.

Lihat metode ini.

diff menjalankan #inspect pada dua objek dan menjalankan alat diff pada objek tersebut. Jika tidak ada perbedaan, pesan ini ditampilkan.

Pada prinsipnya, Anda ingin dua objek yang tidak sama memiliki keluaran berbeda saat diperiksa. Ini tidak ditulis secara tertulis, dan beberapa kelas di perpustakaan standar Ruby tidak memenuhi properti ini, seperti Time. Jika menyangkut kelas Anda sendiri, mungkin Anda telah menulis metode #inspect khusus?

Mengenai Time, inspeksi hanya menampilkan detik, bukan pecahan, tetapi persamaan melihat pecahan, jadi dua objek waktu mungkin tidak sama tetapi masih terlihat sama ketika diperiksa.

Mengenai Array, jika objek yang termasuk di dalamnya tidak sama tetapi terlihat sama ketika diperiksa, hal ini akan menyebabkan pesan tersebut ditampilkan.

Jika Anda mendapatkan pesan ini meskipun keluaran pemeriksaan berbeda, berarti ada yang salah dengan alat diff. MiniTest mencoba menebak-nebak tentang alat berbeda mana yang akan digunakan. Anda dapat memeriksa alat diff yang dipilih dengan mencetak MiniTest::Assertions.diff.

Tentang kesetaraan objek

Jika masalah sebenarnya adalah objek Anda tidak sama dengan yang Anda harapkan, Anda harus melihat bagaimana metode == didefinisikan di kelas masing-masing. Implementasi default melihat id objek yang diberikan ke setiap objek saat dipakai, yang mungkin bukan yang Anda inginkan jika misalnya berurusan dengan objek yang mewakili baris database.

person Jesper    schedule 24.02.2015
comment
Saya tidak membuat metode #inspect khusus pada objek apa pun, dan yang aneh adalah saya baru saja menguji semuanya di lingkungan yang berbeda (OS X Yosemite), dan semuanya berfungsi dengan baik - person Fabian Silva; 24.02.2015
comment
Apa sistem aslinya? - person Jesper; 24.02.2015
comment
Ubuntu 14.10 (Ada di bagian bawah pertanyaan saya), dan saya menggunakan Ruby 2.2 dan 2.0 - person Fabian Silva; 24.02.2015
comment
Saya minta maaf karena tidak menyadarinya. Sudahkah Anda memeriksa keluaran MiniTest::Assertions.diff? - person Jesper; 24.02.2015
comment
Di sistem mana? Apakah pernyataan tersebut berperilaku sama di ubuntu dan os x? Apakah hanya pesannya saja yang berbeda? - person Jesper; 24.02.2015
comment
Ya, OS X tidak menampilkan pesan kegagalan apa pun, semua pengujian berjalan normal. Kedua sistem juga menunjukkan diff -u - person Fabian Silva; 24.02.2015
comment
saya bingung. Semoga berhasil dengan ini. - person Jesper; 24.02.2015

Mungkin contoh pengkodean 2 objek berbeda. Gunakan encoding dan force_encoding untuk memeriksa :

puts obj1.encoding
puts obj2.encoding

Berikut ini contoh keluarannya:

ISO-8859-1
ASCII-8BIT

Dalam hal ini contoh pengkodean obj1 adalah ISO-8859-1 dan contoh pengkodean obj2 adalah ASCII-8BIT. Kemudian untuk mengonversi contoh pengkodean obj1 ke ASCII-8BIT dengan force_encoding:

assert_equal(obj1.force_encoding(Encoding::ASCII_8BIT), obj2)

Untuk detail lebih lanjut silakan periksa https://ruby-doc.org/core-2.2.0/Encoding.html

person Protocol    schedule 06.12.2016

Saya mengalami kesalahan berikut:

No visible difference in the String#inspect output.

dan mencoba jawaban @ Protokol - saya mengerti:

NoMethodError: undefined method `encoding' for "5930128297ebef21e1c7fd50":BSON::ObjectId

Saya menggunakan Mongoid, jadi setidaknya untuk masalah ini, solusinya adalah memanggil to_s pada objek BSON dan kesetaraan string saya sesuai dengan yang saya harapkan.

person dax    schedule 01.06.2017

Jika Anda hanya ingin mencocokkan dengan pernyataan Anda, Anda selalu dapat mengonversi kedua nilai tersebut ke tipe lainnya.

Ex:

assert_equal object_one.to_s, object_two.to_s
person Ricardo Green    schedule 26.01.2021