Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. TDD
Code

Factory Girl 101

by
Length:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Muhammad Hakim Almadani (you can also view the original English article)

Mini seri dua bagian ini ditulis untuk orang-orang yang ingin terjun bekerja dengan Factory Girl dan memotong untuk mengejar tanpa menggali dokumentasi terlalu banyak. Bagi orang-orang yang mulai bermain dengan tes agak baru-baru ini, saya melakukan yang terbaik untuk membuatnya tetap ramah pemula.

Jelas, setelah berada di posisi yang sama pada titik tertentu membuat saya percaya bahwa tidak perlu banyak untuk membuat orang baru merasa lebih nyaman dengan pengujian. Mengambil sedikit lebih banyak waktu untuk menjelaskan konteks dan demistifying istilah yang jauh dalam mengurangi tingkat frustrasi untuk pemula.

konten

  • Intro & konteks
  • Perlengkapan
  • Konfigurasi
  • Mendefinisikan factories
  • Menggunakan factories
  • Warisan
  • Beberapa catatan
  • Urutan

Intro & konteks

Mari kita mulai dengan sedikit sejarah dan berbicara tentang orang-orang baik di thoughtbot yang bertanggung jawab untuk permata Ruby yang populer ini. Kembali di 2007/2008 Ferris Joe, CTO di thoughtbot, telah dengan perlengkapan dan mulai memasak sendiri solusi. Melalui berbagai file untuk menguji metode tunggal adalah titik sakit umum ketika berurusan dengan perlengkapan. Menempatkan berbeda dan mengabaikan semua jenis inflexibilities, praktek itu juga mengarah ke menulis tes yang tidak memberitahu Anda banyak tentang konteks mereka sedang diuji segera.

Tidak yang dijual di bahwa praktek saat ini membuatnya memeriksa berbagai solusi untuk pabrik, namun tidak satupun dari mereka didukung segala sesuatu yang ia inginkan. Jadi dia datang dengan Factory Girl, yang membuat pengujian dengan data tes lebih mudah dibaca, KERING dan juga lebih eksplisit dengan memberi Anda konteks untuk setiap tes. Beberapa tahun kemudian, Josh Clayton, Direktur Pengembangan thoughtbot di Boston, mengambil alih sebagai pengelola proyek. Dari waktu ke waktu permata ini telah terus tumbuh dan menjadi "fixture" dalam komunitas Ruby.

Mari berbicara lebih banyak tentang poin-poin utama yang menyakitkan Factory Girl memecahkan. Saat Anda membuat rangkaian pengujian, Anda berurusan dengan banyak catatan terkait dan dengan informasi yang sering berubah. Anda ingin dapat membangun set data untuk tes integrasi Anda yang tidak rapuh, mudah untuk mengelola dan eksplisit. Pabrik-pabrik data Anda harus dinamis dan dapat merujuk kepada pabrik lain — sesuatu yang di bagian luar YAML perlengkapan dari masa lalu.

Kenyamanan lain yang Anda ingin memiliki adalah kemampuan untuk menimpa atribut untuk objek pada terbang. Pabrik gadis memungkinkan Anda untuk melakukan semua itu dengan mudah — mengingat fakta bahwa itu ditulis di Ruby dan banyak metaprogramming sihir yang terjadi di balik layar — dan Anda akan diberikan bahasa domain-spesifik besar yang juga mudah pada mata.

Membangun data jadwal Anda dengan permata ini dapat digambarkan sebagai mudah, efektif dan secara keseluruhan lebih mudah daripada bermain-main dengan perlengkapan. Dengan cara itu Anda dapat menangani lebih dengan konsep dari kolom sebenarnya dalam database. Tapi cukup berbicara pembicaraan, mari kita mendapatkan tangan kami agak kotor.

Perlengkapan?

Orang-orang yang memiliki pengalaman dengan aplikasi pengujian dan yang tidak perlu belajar tentang konsep jadwal, jangan ragu untuk melompat tepat ke depan ke bagian berikutnya. Ini adalah untuk pemula yang hanya perlu update tentang data pengujian.

Perlengkapan adalah data sampel — bahwa itu benar-benar! Untuk sepotong baik suite tes Anda Anda ingin dapat mengisi database uji Anda dengan data yang disesuaikan dengan kasus uji yang spesifik Anda. Selama beberapa waktu, banyak devs digunakan YAML untuk data ini — yang membuatnya database independen. Di belakang, menjadi mandiri dengan cara itu mungkin adalah hal terbaik tentang itu. Itu lebih atau kurang satu file untuk setiap model. Itu sendiri mungkin memberi Anda gambaran tentang semua jenis sakit kepala orang-orang mengeluh tentang. Kompleksitas adalah musuh tumbuh cepat yang YAML hampir tidak dilengkapi untuk mengambil secara efektif. Di bawah ini Anda akan melihat apa .yml file tersebut dengan data tampak seperti tes.

YAML file: secret_service.yml

Kelihatannya seperti hash, bukan? Ini adalah daftar dipisahkan usus besar pasangan kunci/nilai yang dipisahkan oleh sebuah ruang kosong. Anda bisa mereferensi node lain dalam satu sama lain jika Anda ingin untuk mensimulasikan Asosiasi dari model Anda. Tetapi saya pikir adil untuk mengatakan bahwa di situlah musik berhenti dan banyak yang mengatakan rasa sakit mereka dimulai. Untuk set data yang sedikit lebih terlibat, perlengkapan YAML sulit dipelihara dan sulit diubah tanpa mempengaruhi pengujian lainnya Anda dapat membuat mereka bekerja, tentu saja-setelah semua, pengembang menggunakan mereka banyak di masa lalu- tapi banyak orang setuju bahwa harga yang harus dibayar untuk mengelola perlengkapan itu hanya sedikit terlalu tinggi.

Untuk menghindari melanggar data pengujian Anda apabila terjadi perubahan tak terelakkan, pengembang gembira untuk mengadopsi strategi baru yang menawarkan lebih banyak fleksibilitas dan perilaku dinamis. Itulah dimana gadis pabrik datang dan meninggalkan masa YAML. Masalah lainnya adalah ketergantungan berat antara tes dan .yml fixture file. Mystery guests juga sakit besar dengan perlengkapan semacam ini. Pabrik gadis memungkinkan Anda menghindari yang dengan membuat objek yang relevan dengan inline tes.

Tentu saja, perlengkapan YAML cepat, dan aku pernah mendengar orang berpendapat bahwa suite lambat pengujian dengan data pabrik gadis membuat mereka kembali ke tanah YAML. Dalam pikiran saya, jika Anda menggunakan pabrik gadis begitu banyak yang benar-benar memperlambat turun tes Anda, Anda mungkin overusing pabrik tidak perlu dan Anda mungkin mengabaikan strategi yang tidak memukul database. Anda akan melihat apa yang saya maksud ketika kita mendapatkan section(s) relevan. Tentu saja, menggunakan apa pun Anda perlu, tetapi menganggap diri memperingatkan jika Anda mendapatkan dibakar oleh YAML.

Saya pikir akan adil untuk menambahkan bahwa di hari-hari awal rel dan Ruby TDD, perlengkapan YAML adalah standar de facto untuk menyiapkan data pengujian dalam aplikasi Anda. Mereka memainkan peranan penting dan membantu industri maju. Saat ini mereka memiliki rep cukup buruk meskipun. Kali berubah, jadi mari kita beralih ke pabrik, yang dimaksudkan untuk menggantikan perlengkapan.

Konfigurasi

Saya asumsikan Anda sudah memiliki Ruby dan RSpec untuk pengujian terinstal di sistem Anda. Jika tidak, datang kembali setelah konsultasi Google dan Anda harus baik untuk pergi. Cukup sederhana, aku akan mengatakan. Anda dapat menginstal permata secara manual di terminal Anda melalui Shell:

atau menambahkannya ke Gemfile Anda:

dan menjalankan bundle install.

Sekarang Anda hanya perlu require Factory Girl untuk menyelesaikan pengaturan. Di sini saya menggunakan RSpec, jadi tambahkan berikut di bagian atas di /spec/spec_helper.rb:

Ruby on Rails

Anda tertutup tentu saja jika Anda ingin menggunakan pabrik gadis dengan Rails. Factory_girl_rails permata menyediakan integrasi rel yang berguna untuk factory_girl.

Shell:

Gemfile:

dan require nya tentu di spec/spec_helper.rb:

Setup sintaks nyaman

Jika Anda lebih suka mengetik sesuatu seperti (tentu Anda lakukan)

Ruby:

Melainkan

setiap kali Anda menggunakan salah satu pabrik-pabrik Anda Anda hanya perlu untuk memasukkan modul FactoryGirl::Syntax::Methods dalam file konfigurasi pengujian. Jika Anda lupa bahwa langkah, Anda memiliki untuk pengantar semua metode pabrik gadis dengan Pendahuluan verbose sama. Ini bekerja dengan aplikasi apapun Ruby, bukan hanya dengan rel yang tentu saja.

Untuk RSpec menemukan spec/spec_helper.rb file dan tambahkan:

Perhatian!

Bagi para pemula antara Anda, hati-hati bahwa blok RSpec.configure akan sudah ada — terkubur di bawah beberapa jumlah komentar. Anda juga dapat melakukan setup yang sama dalam file terpisah sendiri — seperti spec/support/factory_girl.rb. Dalam hal ini Anda harus menambahkan blok seluruh config Anda sendiri tentu saja.

Konfigurasi yang sama bekerja jika Anda menggunakan perpustakaan lain untuk pengujian:

  • Test::unit
  • Mentimun
  • Bayam
  • MiniTest
  • MiniTest::Spec
  • minitest-rel

Anda dapat pergi lebih mewah dengan konfigurasi Anda dengan melemparkan di DatabaseCleaner, misalnya, tapi dokumentasi menyiratkan bahwa konfigurasi ini sudah cukup untuk pergi, jadi saya akan melanjutkan dari sini.

Mendefinisikan pabrik

Anda bisa mendefinisikan pabrik Anda di mana saja, tetapi mereka akan secara otomatis dimuat jika mereka ditempatkan di lokasi-lokasi berikut:

RSpec:

Test::unit:

Seperti yang Anda lihat, Anda memiliki pilihan untuk membagi mereka ke dalam file terpisah yang mengikuti logika apapun, atau bundel pabrik Anda bersama-sama ke dalam satu file besar factories.rb. Kompleksitas proyek Anda akan menjadi pedoman terbaik untuk ketika Logis memisahkan pabrik ke dalam file terpisah mereka sendiri.

Telanjang-tulang pabrik

Pabrik gadis menyediakan sintaks DSL ruby yang berkembang dengan baik untuk mendefinisikan pabrik seperti user, posting atau objek lain — tidak hanya objek Active Record. Kelas Ruby "Plain" baik-baik saja. Anda mulai dengan mendirikan sebuah blok mendefinisikan di file factories.rb Anda.

Ruby:

Semua pabrik didefinisikan dalam blok ini. Pabrik hanya perlu : symbol nama dan satu set atribut untuk memulai. Nama ini perlu versi snake_cased dari Model yang ingin meniru — seperti SecretServiceAgent dalam contoh berikut. Pabrik di bawah ini dinamai secret_service_agent dan memiliki atribut yang disebut name, favorite_gadget dan skills.

Ruby:

Perhatian!

Jika Anda mengambil satu hal dari artikel ini maka itu harus berikut: hanya mendefinisikan paling telanjang-tulang pabrik mungkin agar dapat berlaku secara default — berlaku dalam arti Active Record validasi, misalnya.

Ketika Factory Girl memanggil save! pada contoh, validasi Anda akan dilakukan. Jika ada yang gagal, ActiveRecord :: RecordInvalid akan dinaikkan. Mendefinisikan hanya minimal memberi Anda lebih banyak fleksibilitas jika perubahan data Anda dan akan mengurangi kemungkinan melanggar tes dan duplikasi — karena kopling berkurang ke inti. Jangan malas ketika Anda menyusun pabrik Anda-itu akan membayar waktu besar!

Jika Anda pikir ini terdengar sulit untuk mengelola, Anda kemungkinan besar akan senang mendengar bahwa ada solusi berguna untuk memisahkan objek beserta atribut mereka. Warisan dan ciri-ciri akan menjadi sekutu besar karena mereka berguna strategi untuk melengkapi telanjang-tulang pabrik dan tetap mereka kering pada waktu yang sama. Pelajari lebih lanjut tentang warisan di bawah ini, dan artikel kedua saya akan sedikit fokus pada sifat-sifat.

Menggunakan Factories

Jika Anda telah menyertakan FactoryGirl::Syntax::Methods di langkah konfigurasi, kita mampu menggunakan sintaks singkatan untuk membuat pabrik di tes Anda. Anda memiliki empat pilihan, orang - orang menebutnya dengan membangun strategi:

membuat

Yang ini mengembalikan sebuah instance dari kelas yang ditiru oleh pabrik. Disarankan untuk menggunakan create hanya ketika Anda benar-benar perlu untuk memukul database. Strategi ini memperlambat test suite Anda jika terlalu sering digunakan berlebihan. Menggunakannya jika Anda ingin menjalankan validasi Anda karena itu akan berjalan Save! di latar belakang. Saya pikir pilihan ini sebagian besar tepat ketika Anda melakukan tes integrasi di mana Anda ingin melibatkan database untuk skenario pengujian Anda.

membangun

Ini instantiates dan menetapkan atribut, tetapi Anda akan mendapatkan instance kembali itu tidak disimpan ke database — build terus objek hanya dalam memori. Jika Anda ingin memeriksa apakah sebuah objek memiliki atribut tertentu, ini akan melakukan pekerjaan, karena Anda tidak perlu akses database untuk hal semacam itu. Di belakang layar tidak menggunakan save!, yang berarti Anda validasi tidak dijalankan.

heads Up!

Bila Anda menggunakan asosiasi dengan itu, Anda mungkin mengalami gotcha kecil. Ada sedikit pengecualian dalam hal tidak menyimpan objek melalui Build — itu membangun objek tetapi menciptakan Asosiasi — yang akan saya bahas dalam bagian tentang pabrik gadis Asosiasi. Ada solusi untuk itu dalam kasus itu tidak apa yang sedang Anda berbelanja untuk.

build_stubbed

Opsi ini diciptakan untuk mempercepat tes Anda dan uji kasus dimana tidak ada kode yang perlu untuk memukul database. Juga instantiates dan menetapkan atribut seperti build, tapi itu hanya membuat benda terlihat seolah-olah mereka telah bertahan. Objek yang dikembalikan memiliki semua atribut ditetapkan dari pabrik Anda mematikan — ditambah id palsu dan nil timestamps. Mereka Asosiasi yang mematikan juga — tidak seperti membangun Asosiasi, yang menggunakan membuat pada objek terkait. Karena strategi ini berurusan dengan Indonesia dan telah ada ketergantungan pada database, tes ini akan secepat mereka bisa.

attributes_for

Metode ini akan kembali hash hanya atribut yang didefinisikan di pabrik relevan — tanpa Asosiasi, cap waktu dan id dari lapangan. Lebih mudah jika Anda ingin membangun sebuah instance dari objek tanpa bermain-main di sekitar dengan atribut hash secara manual. Saya telah melihat sebagian besar digunakan dalam Controller spesifikasi seperti ini:

Ruby:

Perbandingan objek

Untuk menutup bagian ini, izinkan saya memberi Anda satu contoh sederhana untuk melihat objek berbeda kembali dari ini empat membangun strategi. Di bawah ini Anda dapat membandingkan empat objek yang berbeda yang Anda akan dapatkan dari attributes_for, create, build dan build_stubbed:

Saya berharap hal ini sangat membantu jika Anda masih memiliki beberapa kebingungan yang meninggalkan tentang bagaimana mereka bekerja dan ketika menggunakan pilihan yang.

Warisan

Anda akan menyukai yang satu ini! Dengan warisan Anda dapat menentukan pabrik hanya dengan atribut yang diperlukan yang masing-masing kelas untuk penciptaan. Pabrik induk ini dapat menelurkan banyak pabrik-pabrik "child" seperti yang Anda lihat cocok untuk menutupi segala macam skenario pengujian dengan berbagai data set. Menjaga data uji DRY sangat penting, dan warisan membuat ini lebih mudah bagi Anda.

Katakanlah Anda ingin menentukan beberapa atribut utama pada sebuah pabrik dan pabrik yang sama memiliki pabrik yang berbeda untuk class yang sama dengan sifat-sifat yang berbeda. Dalam contoh di bawah ini, Anda dapat melihat bagaimana Anda dapat menghindari mengulangi atribut hanya gabungkan pabrik Anda. Mari kita meniru Spy class yang dibutuhkan untuk beradaptasi dengan tiga skenario pengujian berbeda.

Factories.rb

some_spec.rb

Seperti Anda dapat mengamati,: bond dan: quartermaster Intendan atribut mewarisi dari orang tua mereka: spy. Pada saat yang sama Anda dapat dengan mudah menimpa atribut yang diperlukan dan menjadi sangat ekspresif tentang hal itu melalui nama pabrik mereka. Bayangkan semua baris kode diselamatkan karena Anda tidak perlu mengulang konfigurasi dasar yang sama jika Anda ingin menguji negara bagian yang berbeda atau obyek terkait. Fitur itu sendiri perlu menggunakan pabrik gadis dan membuat sulit untuk kembali ke perlengkapan YAML.

Jika Anda ingin menghindari bersarang definisi pabrik, Anda juga bisa menghubungkan factories panrent mereka secara eksplisit dengan menyediakan hash parent:

Factories.rb

Ini adalah fungsi yang sama dan hampir seperti DRY.

Beberapa catatan

Berikut adalah kecil tetapi tetap menyambut selain factory girl yang membuat berurusan dengan daftar mudah sebagai pie:

  • build_list
  • create_list

Setiap sekali-sekali, dalam situasi di mana Anda ingin memiliki beberapa contoh dari beberapa pabrik tanpa banyak fuzz, ini akan berguna. Kedua metode akan mengembalikan sebuah array dengan jumlah pabrik item-item. Pretty rapi benar?

Ruby:

Ada perbedaan halus antara dua pilihan, tapi aku yakin Anda memahami mereka sekarang. Saya juga harus menyebutkan bahwa Anda dapat memberikan kedua metode dengan hash atribut jika Anda ingin menimpa pabrik atribut pada terbang untuk beberapa alasan. Menimpa akan makan sedikit kecepatan pengujian Anda jika Anda membuat banyak tes data dengan menimpa. Mungkin memiliki sebuah pabrik yang terpisah dengan atribut ini berubah akan menjadi pilihan yang lebih baik untuk membuat daftar.

Anda sering perlu sepasang benda, sehingga gadis pabrik menyediakan lain dua pilihan:

  • build_pair
  • create_pair

Ini adalah ide yang sama seperti di atas, tetapi array dikembalikan memegang hanya dua catatan pada suatu waktu.

Urutan

Jika Anda berpikir mata-mata penamaan bisa kurang statis, Anda benar. Dalam bagian akhir ini kita akan melihat menciptakan berurutan nilai unik sebagai data pengujian untuk atribut pabrik Anda.

Kapan ini mungkin berguna? Apa tentang alamat email yang unik untuk pengujian otentikasi atau nama pengguna unik misalnya? Itulah dimana urutan bersinar. Mari kita lihat beberapa berbeda cara-cara yang Anda dapat membuat penggunaan sequence:

"Global" urutan

Karena urutan ini didefinisikan "global" untuk semua pabrik Anda — itu tidak termasuk satu pabrik tertentu-Anda dapat menggunakan generator urutan ini untuk semua pabrik Anda mana pun Anda butuhkan: spy_email. Yang Anda butuhkan adalah generate dan nama Anda urutan.

Atribut

Sebagai variasi kecil yang super nyaman, aku akan menunjukkan kepada Anda cara langsung menetapkan urutan sebagai atribut untuk pabrik Anda. Gunakan kondisi yang sama seperti di atas, di mana Anda urutan didefinisikan "global". Dalam kasus sebuah pabrik definisi Anda dapat meninggalkan generate metode panggilan dan pabrik gadis akan menetapkan nilai kembali dari urutan langsung ke atribut dengan nama yang sama. Rapi!

Atribut malas

Anda juga dapat menggunakan sequence pada lazy atribut. Aku akan menutupi topik ini dalam artikel kedua, tetapi demi kelengkapan aku ingin menyebutkan itu di sini juga. Dalam kasus Anda perlu nilai unik yang diberikan pada saat contoh akan dibuat — hal ini disebut lazy karena atribut ini menunggu dengan nilai tugas hingga objek Instansiasi — urutan hanya perlu satu blok untuk bekerja dengan baik.

Blok untuk atribut pabrik mendapat dievaluasi ketika objek mendapat instantiated. Dalam kasus kami, Anda akan mendapatkan sebuah string yang terdiri dari sejumlah misi yang unik dan objek DateTime baru sebagai nilai-nilai untuk setiap :spy yang akan digunakan.

In-Line urutan

Pilihan ini yang terbaik saat serangkaian nilai-nilai unik hanya dibutuhkan atribut untuk sebuah pabrik tunggal. Itu akan membuat tidak masuk akal untuk menetapkan di luar pabrik itu dan mungkin harus mencarinya di tempat lain jika Anda perlu untuk men-tweak itu. Dalam contoh di bawah ini kami mencari untuk menghasilkan id unik untuk setiap mata-mata mobil.

Yah, mungkin kita harus memberikan atribut vehicle_id_number nilai awal lain daripada 1? Katakanlah kita ingin account untuk beberapa prototipe sebelum mobil siap untuk produksi. Anda dapat memberikan argumen kedua sebagai nilai awal untuk urutan Anda. Mari kita pergi dengan 9 kali ini.

Pikiran penutup

Seperti yang Anda lihat sekarang, Factory Girl menawarkan baik seimbang DSL Ruby yang membangun objek daripada catatan Database untuk data uji. Ini membantu untuk menjaga tes Anda terfokus, kering dan dapat dibaca ketika Anda berurusan dengan dummy data. Itu adalah prestasi yang cukup padat dalam buku saya.

Ingat bahwa telanjang-tulang pabrik definisi kunci untuk kewarasan masa depan. Data pabrik yang lebih Anda menempatkan di ruang uji global Anda, semakin besar kemungkinan Anda akan mengalami semacam pemeliharaan sakit.

Untuk unit Anda tes, pabrik gadis akan tidak perlu dan hanya memperlambat suite tes Anda. Josh Clayton akan menjadi yang pertama untuk membuktikan hal ini dan akan merekomendasikan hal ini praktek terbaik untuk menggunakan pabrik gadis selektif dan sesedikit mungkin.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.