Bagaimana cara menguji ArcObjects dengan Mocking?

10

Saya penggemar berat unit testing, tetapi masih menggunakan FGDB untuk mengambil fitur untuk menjalankan pengujian unit saat menggunakan kerangka ArcObjects.

Adakah yang berhasil menggunakan ejekan terhadap pemikiran seperti IFeature, IGeometry, IWorkspace, dll. Jika demikian, saya ingin melihat beberapa contoh bagaimana Anda melakukannya. Saya tidak terlalu peduli tentang kerangka kerja mengejek apa yang Anda gunakan, hanya melihat bagaimana Anda melakukannya akan sangat dihargai.

Masalah yang saya lihat adalah bahwa Anda harus mengiris dan memotong di antara begitu banyak antarmuka pada objek yang sama, sehingga biaya overhead untuk membuat objek tiruan yang representatif akan sangat besar.

BlinkyBill
sumber
Untuk orang lain yang mungkin tidak tahu tentang Mengejek (seperti saya), silakan lihat tautan ini. Hal yang menarik. stackoverflow.com/questions/300177/…
Simon

Jawaban:

14

Kami telah, pada proyek besar, berhasil cukup baik untuk mengisolasi kode ArcObjects dari logika bisnis kami. Itu umumnya cara untuk pergi, saya katakan, daripada mencoba untuk mengejek semuanya, bahkan jika mungkin menggunakan kerangka kerja mengejek untuk mendapatkan beberapa cara.

Tanyakan pada diri sendiri, Mengapa Anda merasa perlu mengejek. Biasanya, itu karena abstraksi yang hilang. Pikirkan tanggung jawab kecil dan meminimalkan permukaan monster ArcObject yang besar dan jelek. Hindari menyeret tipe ArcObject hanya karena beberapa aspek dari mereka diperlukan di suatu tempat.

Saya dapat memberikan satu contoh nyata dari proyek kami. Sebagian kode tampaknya tergantung pada IMxDocument. Ternyata satu-satunya alasan adalah bahwa tampilan aktif perlu di-refresh. Jadi kami membuat antarmuka IViewRefresher dan hanya bekerja pada itu; mudah diejek dan diuji. Selain itu, itu membuat maksud kode menjadi lebih jelas dan menghilangkan godaan bagi seseorang untuk mulai melakukan hal-hal lucu dengan IMxDocument yang tidak seharusnya mereka lakukan karena semua yang ingin kita lakukan di sini adalah penyegaran. Latihan yang sama dapat dilakukan dengan banyak kode ArcObjects.

Selain itu, kami membungkus semua akses ke kelas fitur dalam jenis pembungkus yang aman, lagi-lagi menyediakan kode yang dapat dipermainkan yang melindungi kode bisnis dari ArcObjects.

Kami telah membahas bahkan tidak menggunakan jenis geometri dari ArcObjects, tetapi saat ini kami mengizinkan antarmuka tersebut untuk digunakan secara langsung dalam kode kami. (Namun, pengetahuan antarmuka hanya diperbolehkan dan semua instantiasi geometri menggunakan pabrik geometri kami sendiri.)

Singkatnya, saya tidak mengolok-olok mengejek tetapi saya mendorong mengejek pada tingkat abstraksi yang berbeda dari ArcObjects.

Cumbayah
sumber
jawaban bagus Cumbayah. Saya juga memiliki banyak unit yang kesulitan menguji kode AO. Contoh yang Anda berikan sangat hebat (IViewRefresher) dan saya mungkin menerapkannya pada pekerjaan saya di sini. Bisakah Anda memberi contoh lebih lanjut?
George Silva
Terima kasih Cumbayah. Inilah yang saat ini saya lakukan pada proyek-proyek menengah hingga besar, membuat perakitan terpisah untuk abstrak semua implementasi AO. Abstraksi ini yang ingin saya uji tanpa menggunakan data yang tersimpan, baik itu ruang kerja XML atau geodatabases dari satu jenis atau lainnya. Saya menemukan bahwa dari waktu ke waktu dengan data yang berbeda, muncul masalah baru, yang kemudian perlu dibuat tes, yang memerlukan data uji tambahan. Seiring waktu saya memiliki begitu banyak data pengujian untuk semua kasus uji, sehingga proyek menjadi besar untuk dikelola dan dipindahkan, mari unduh oleh server build otomatis saya.
BlinkyBill
Cumbayah, ini kedengarannya luar biasa. Saya akan menyukai beberapa contoh. Pernahkah Anda mempertimbangkan untuk menyajikan sesuatu tentang hal ini di salah satu konferensi ESRI? Saya pikir komunitas ESRI / GIS sedang sekarat untuk hal-hal semacam ini. Senang melihat beberapa gerakan open source memulai untuk menguji / mengejek ArcObjects.
Keith G
Ini adalah topik lama yang saya mengerti, tetapi apakah ada kemungkinan kami bisa mendapatkan sampel dari "pabrik geometri Anda sendiri"? Saya mencoba membuat organisasi saya bergerak ke arah pengujian unit, tapi saya terpaku pada monyet ArcObjects.
Luke
4

Pengujian Unit untuk Pengembang Esri oleh Dave Bouwman dan Brian Noyle adalah tempat awal yang cukup bagus - terutama karena mereka mengeluarkan beberapa kode untuk dilihat.

tentu saja
sumber
Terima kasih untuk pointer bwreilly. Apa yang dilakukan Dave hanyalah menggunakan representasi fitur XML. Jadi, sementara ini membantu, masih bergantung pada menyimpan data untuk tes, yang merupakan apa yang saya coba hindari.
BlinkyBill