Autofixture: SemanticComparison - Kemiripan Dua Koleksi Anak

Dibuat pada 21 Jun 2017  ·  13Komentar  ·  Sumber: AutoFixture/AutoFixture

Saya yakin ini telah ditanyakan sebelumnya, dan saya telah mencari di Google ini dan menemukan beberapa solusi kompleks, tetapi tetap begini. Saya memiliki dua objek kompleks dengan tipe yang persis sama dan saya ingin membandingkannya; namun, mereka berisi kumpulan item yang juga perlu dibandingkan, tetapi saya ingin mengabaikan pesanan. Apakah ini mungkin dengan SemanticComparison? Saat ini saya menggunakan mekanisme perbandingan json, tetapi men-debug ini ketika perbandingan gagal adalah mimpi buruk. Sepertinya menggunakan Likenesskelas langsung dari kotak akan memperbaikinya, tetapi itu merusak koleksi meskipun mereka berisi item yang identik.

question

Komentar yang paling membantu

Untuk skenario ini, saya telah menggunakan https://github.com/jmansar/SemanticComparisonExtensions dengan efek luar biasa. Dengan itu, saya dapat mengontrol kemiripan batin dan sedikit mengubah hal-hal.

Membuat cara terbaik untuk dengan cepat mengatur perbandingan bersarang yang kompleks juga.

Semua 13 komentar

Bisakah Anda menunjukkan kepada kami bagaimana rupa objek yang Anda coba bandingkan?

Juga, sudahkah Anda mencoba menggunakan SemanticComparer<T> secara langsung seperti yang ditunjukkan pada contoh ini ? Ini lebih fleksibel daripada menggunakan Likeness<TSource, TDestination> .

Objek memiliki struktur ini:

public class SongDto
    {
        public string Lyrics { get; set; }
        public IEnumerable<TagDto> Tags { get; set; }
        public string FileName { get; set; }
        public string CustomPromoLink { get; set; }
        public string UPC { get; set; }
        public YoutubeVideoDto YouTubeVideo { get; set; }
    }

Dua properti yang tersendat adalah koleksi TagDto dan YouTubeVideoDto, idealnya ia akan melintasi ini dan terus membandingkan sedalam mereka pergi. Kalau tidak, saya akan tetap menggunakan pembanding JSON saya karena cara membandingkan ini akan membuat saya melakukan banyak pekerjaan.

Saya ingin tahu bagaimana pembanding JSON menangani IEnumerable<TagDto> jika itu adalah urutan yang tak terbatas?

Bagaimana sesuatu menangani urutan tak terbatas? Saya tentu saja tidak mengatakan itu sempurna, dan saya jelas mencari solusi lain karena itu selami SemanticComparison, tetapi jika SC tidak dapat menangani situasi ini, maka saya tidak melihat gunanya menggunakannya. Saya berasumsi ada cara untuk menangani ini, saya hanya tidak dapat menemukan solusi yang baik di luar sana di ole interwebs.

Anda dapat melakukan yang serupa dengan this , dengan menggunakan DelegatingMemberComparer yang selalu mengembalikan True untuk IEnumerable<TagDto> atau, bahkan lebih baik, membandingkan IEnumerable<TagDto> dengan cara yang Anda inginkan .

(Lihat instance DelegatingMemberComparer kedua dan ketiga di tautan di atas.)

Oke, terima kasih dengan tulus atas bantuannya.

Jadi intinya, saya masih harus menulis DelegatingMemberComparer khusus untuk setiap jenis. Jadi, keuntungan menggunakan perpustakaan adalah bahwa dalam pengujian yang gagal, ia memberi tahu saya properti apa yang berbeda?

Saya masih harus menulis DelegatingMemberComparer khusus untuk setiap jenis

  • Satu DelegatingMemberComparer untuk semua jenis, yang melakukan a.Equals(b) atau bahkan menggunakan Keserupaan untuk itu
  • Satu DelegatingMemberComparer untuk IEnumerable<TagDto> seperti yang ditunjukkan pada tautan di atas

dalam tes yang gagal itu memberi tahu saya properti apa yang berbeda

Tidak, itulah yang dilakukan Likeness...

Likeness menggunakan SemanticComparer<T> internal untuk membandingkan objek... Jadi, jika Anda akan menggunakan SemanticComparer<T> Anda mungkin lebih fleksibel tetapi Anda akan kehilangan fitur pelaporan Likeness.

Jika Anda perlu hal-hal pelaporan, Anda mungkin bisa mencapai sesuatu yang serupa dengan menggunakan Likeness ini With dan EqualsWhen sintaks seperti yang ditunjukkan dalam ini misalnya.

Oke, sekarang saya kembali ke pertanyaan awal saya, apa yang saya dapatkan dari perpustakaan ini jika hal-hal pelaporan tidak ada lagi (dari apa yang saya baca Likeness akan ditinggalkan), dan jika menulis DelegatingMemberComparer yang melakukan .Equals(b), itu akan melakukan perbandingan referensi atau saya harus mengganti metode Equals setiap objek. Apakah itu benar?

Jadi apa keuntungan menggunakan xUnit Assert dengan IEqualityComparers?

Saya hanya ingin menambahkan bahwa menurut saya AutoFixture luar biasa, dan saya pikir SemanticComparer akan membuat pernyataan saya semudah pengaturan saya.

Saya akan mencoba memberikan 3 contoh (Likeness, SemanticComparer, IEqualityComparer) untuk SongDto sehingga kita dapat melanjutkan diskusi dari sana.—Saya sedang sibuk dengan pekerjaan saat ini, jadi mungkin perlu beberapa saat. ..

@moodmosaic Terima kasih banyak!! Dan jika Anda ingin mengarahkan saya ke beberapa artikel yang menjelaskan mengapa SemanticComparer, mungkin itu akan membuat saya kurang padat dalam hal ini.

Untuk skenario ini, saya telah menggunakan https://github.com/jmansar/SemanticComparisonExtensions dengan efek luar biasa. Dengan itu, saya dapat mengontrol kemiripan batin dan sedikit mengubah hal-hal.

Membuat cara terbaik untuk dengan cepat mengatur perbandingan bersarang yang kompleks juga.

@cvbarros Ekstensi itu bekerja seperti pesona, menutup masalah ini!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ecampidoglio picture ecampidoglio  ·  7Komentar

Ephasme picture Ephasme  ·  3Komentar

DeafLight picture DeafLight  ·  5Komentar

josh-degraw picture josh-degraw  ·  4Komentar

mjfreelancing picture mjfreelancing  ·  4Komentar