Bagaimana Anda menjalankan file uji / spesifikasi tunggal di RSpec?

282

Saya ingin dapat menjalankan tes file spec tunggal - untuk satu file yang saya edit, misalnya. rake specmengeksekusi semua spesifikasi. Proyek saya bukan proyek Rails, jadi rake spec:doctidak berfungsi.

Tidak tahu apakah ini penting, tapi ini struktur direktori saya.

./Rakefile
./lib
./lib/cushion.rb
./lib/cushion
./lib/cushion/doc.rb
./lib/cushion/db.rb
./spec
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb
Jonathan Tran
sumber

Jawaban:

392

Atau Anda dapat melewati rake dan menggunakan perintah 'rspec':

rspec path/to/spec/file.rb

Dalam kasus Anda, saya pikir selama file ./spec/db_spec.rb Anda menyertakan pembantu yang tepat, itu akan berfungsi dengan baik.

Jika Anda menggunakan versi rspec yang lebih lama, itu adalah:

spec path/to/spec/file.rb
Cameron Booth
sumber
31
dengan rspec baru Anda harus menggunakan "rspec path / to / file.rb"
djburdick
3
Mungkin saya salah melakukannya, tetapi saya harus melakukan "bundle exec rspec path / to / spec / file.rb"
andrhamm
2
Jika Anda menggunakan Rails, Anda mungkin ingin mengeksekusi spesifikasi Anda menggunakan Rake untuk memastikan Anda memulai dari database kosong.
superluminary
@andrhamm, Anda hanya menjalankan spesifikasi Anda dalam konteks bundel Anda. Ini diperlukan jika Anda tidak menggunakan permata (yang datang secara default dengan rvm, dan merupakan ekstensi terpisah ke rbenv)
Caleb
6
Jika Anda ingin menjalankan hanya satu tes, Anda harus menambahkan nomor baris dari awal tes ke file. Contoh: rspec path / ke / spec / file.rb: 455
runamok
201

Doa mentah:

rake spec SPEC = spec / controllers / session_controller_spec.rb \
          SPEC_OPTS = "- e \" harus masuk dengan cookie \ ""

Sekarang cari tahu bagaimana cara menanamkan ini ke editor Anda.

mislav
sumber
1
Seperti yang saya katakan, saya tidak di rel sehingga tidak ada pengontrol. Tapi ya, "rake spec SPEC = file.rb" berfungsi. Terima kasih! Saya sedang mengerjakan integrasi Emacs sekarang.
Jonathan Tran
5
Jangan meluncurkan rakefile jika Anda bisa menghindarinya. Dibutuhkan usia frickin
Orion Edwards
2
Saya mengubah jawaban yang diterima, tetapi param SPEC_OPTS juga membantu saya.
Jonathan Tran
2
Nah, itu yang saya sebut jawaban yang bagus. Mengapa tidak ditandai sebagai "Jawab"?
gmile
1
Menjalankan spec secara langsung sering kali merupakan pilihan terbaik, tetapi ada banyak waktu ketika Anda harus menjalankan rake untuk berbagai bit ajaib dalam custom Rakefile
Nerdmaster
124

Pertanyaan ini adalah yang lama, tetapi muncul di bagian atas Google ketika mencari cara menjalankan tes tunggal. Saya tidak tahu apakah ini tambahan baru, tetapi untuk menjalankan satu tes dari spec Anda dapat melakukan hal berikut:

rspec path/to/spec:<line number>

di mana-line number- adalah nomor baris yang berisi bagian dari pengujian Anda. Misalnya, jika Anda memiliki spesifikasi seperti:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

Katakanlah itu disimpan dalam spec / models / foo_spec.rb. Maka Anda akan menjalankan:

rspec spec/models/foo_spec.rb:2

dan itu hanya akan menjalankan satu spec. Bahkan, angka itu bisa berkisar dari 2 hingga 5.

Semoga ini membantu!

juanpaco
sumber
Ini menarik, meskipun sepertinya tidak berfungsi setelah Anda mengubah spec menjadi beberapa file (mis. Anda hanya dapat menggunakannya dengan file _spec.rb utama, tetapi jika tidak ada contoh Anda di dalamnya, itu tidak akan berjalan apa-apa) Juga jika Anda mencoba menggunakannya untuk file yang bukan file spesifikasi tingkat atas, itu juga tidak akan menjalankan apa pun.)
Trejkaz
Saya tidak begitu mengikuti. Apa yang Anda maksud dengan "file spesifikasi tingkat atas?" Test suite saya cukup banyak dibagi menjadi beberapa file, dan saya selalu dapat menjalankan tes dalam satu file menggunakan metode ini. Apakah maksud Anda memiliki file yang merupakan file requirespesifikasi Anda yang lain?
juanpaco
Saya dapat menggunakan ini pada file apa saja di tingkat mana pun di bawah direktori spec /. Saya percaya Trejkaz salah.
Michael Durrant
7
ini luar biasa dan harus di atas!
Tommaso Barbugli
4
Saya menggunakan ini sepanjang waktu, tetapi kadang-kadang Anda ingin menjalankan beberapa tes dari satu file. Maka Anda dapat mengetik semua contoh seperti ini:rspec spec/models/foo_spec.rb:2:12:49
swilgosz
61

Anda juga dapat menggunakan teks aktual dari test case * e * xample dengan -e!

Sehingga untuk:

it "shows the plane arrival time"

kamu bisa memakai

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

tidak perlu menyapu di sini.

tcurdt
sumber
Ini yang Anda butuhkan, kecuali bahwa "spec" harus diganti dengan "rspec" seperti yang dinyatakan @ bandhunt
Nicolas Wormser
19

from help (spec -h):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

Contoh: spec spec / runner_spec.rb -l 162

boblin
sumber
3
Dalam versi Rspec yang lebih baru, Anda menambahkan nomor baris setelah titik dua :per dokumentasi dan jawaban populer.
dragon788
13

Jika Anda menginstal rspec sebagai plugin dan bukan sebagai permata, maka Anda tidak akan memiliki specexecutable.

Bagaimanapun, yang perlu Anda lakukan adalah menjalankan file menggunakan ruby. Kode rspec cukup pintar untuk menjalankan tes untuk Anda.

misalnya:

ruby myclass_spec.rb
Orion Edwards
sumber
2
Apakah mungkin menjalankan satu pengujian dalam file seperti ini?
Ian Vaughan
12

http://github.com/grosser/single_test memungkinkan Anda melakukan hal-hal seperti ..

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last
Zeke
sumber
Tampaknya permata itu belum dipelihara, komit terakhir adalah 5 tahun yang lalu!
thegreendroid
10

Ruby 1.9.2 dan Rails 3 memiliki cara mudah untuk menjalankan satu file spesifikasi:

  ruby -Spesifikasi spec / model / user_spec.rb

Penjelasan:

  • rubyperintah cenderung lebih cepat daripada rakeperintah
  • -I spec berarti "sertakan direktori 'spec' saat mencari file"
  • spec/models/user_spec.rb adalah file yang ingin kita jalankan.
joelparkerhenderson
sumber
Bisakah Anda menjalankan satu pengujian dalam file itu dengan beberapa opsi tambahan?
Ian Vaughan
10

Untuk menjalankan semua file rspec Anda:rspec

Catatan: Anda harus berada di root proyek Anda

Untuk menjalankan satu file rspec:rspec 'path_to/spec.rb'

Catatan: ganti 'path_to / spec.rb' dengan path Anda. Tanda kutip opsional.

Untuk menjalankan satu tes rspec dari satu file:rspec 'path_to/spec.rb:7'

Catatan:: 7 adalah nomor baris tempat tes dimulai

nflauria
sumber
5

Saya mengalami masalah untuk membuat contoh-contoh ini bekerja, mungkin karena posnya sudah tua dan perintahnya sudah berubah?

Setelah melihat-lihat saya menemukan ini bekerja:

rspec spec / model / user_spec.rb

Itu akan menjalankan hanya satu file dan memberikan output yang berguna di terminal.

Greg Hemphill
sumber
Ini disebutkan dalam komentar di jawaban yang diterima. Ya, saya pikir posting ini sudah sangat tua sehingga nama perintah telah berubah.
Jonathan Tran
3

Atau, lihat autotest.

Menjalankan autotest di jendela perintah akan berarti bahwa file spesifikasi akan dieksekusi setiap kali Anda menyimpannya. Juga, itu akan dijalankan setiap kali file yang Anda tentukan dijalankan.

Misalnya, jika Anda memiliki file spec model bernama person_spec.rb, dan file model yang dispesifikasikan disebut person.rb, maka setiap kali Anda menyimpan salah satu file ini dari editor Anda, file spec akan dieksekusi.

fatgeekuk
sumber
3

Meskipun banyak jawaban bagus ditulis untuk pertanyaan ini, tidak satupun dari mereka menggunakan pendekatan Rspectags .

Saya menggunakan tag untuk menjalankan satu atau lebih spesifikasi dalam file yang berbeda - hanya yang terkait dengan tugas pengembangan saya saat ini.

Misalnya, saya menambahkan tag "dev" dengan nilai "saat ini":

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

lalu aku lari

bundle exec rspec . --tag dev:current

Tag / nilai yang berbeda dapat diatur dalam spesifikasi atau grup individual.

Victor BV
sumber
2

Katakanlah, Anda sedang menjalankan tes untuk membuat todo. Anda selalu dapat menjalankan kode spesifik todo spesifik menggunakan file file crete_spec.rb seperti di bawah ini.

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

Jika Anda ingin menjalankan semua spesifikasi dalam satu singkat.

   rspec 

Jika Anda ingin menjalankan semua spesifikasi pada pengguna pengontrol tertentu ini.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

Semoga ini memberi Anda lebih banyak pengertian!

Prabhakar Undurthi
sumber