Bagaimana cara menjalankan tes RSpec tunggal?

306

Saya memiliki file berikut:

/spec/controllers/groups_controller_spec.rb

Perintah apa di terminal yang saya gunakan untuk menjalankan spesifikasi itu dan di direktori apa saya menjalankan perintah?

File permata saya:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

File spesifikasi:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end
AnApprentice
sumber
Anda dapat menjalankan tes seperti bundel exec rspec ./spec/controllers/groups_controller_spec.rb:6, hanya menjalankan pengujian khusus ini. Info lebih lanjut di sini: kolosek.com/rails-rspec-setup
Nesha Zoric
bundle exec rspec spec --helpkami akan memberikan jawabannya:
Thomas Decaux

Jawaban:

15

Tidak yakin berapa lama lebah ini tersedia, tetapi ada konfigurasi Rspec untuk menjalankan pemfilteran - jadi sekarang Anda dapat menambahkan ini ke spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

Dan kemudian menambahkan tag fokus ke it, contextatau describehanya menjalankan blok itu:

it 'runs a test', :focus do
  ...test code
end

Dokumentasi RSpec:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method

emc
sumber
1
Ini membutuhkan infrastruktur yang berubah. Dan ingat untuk mengubahnya kembali. Saya akan merekomendasikan tidak melakukan ini dan hanya menggunakan rspecperintah untuk menjalankan spec dengan parameter yang sesuai untuk menunjukkan yang
Michael Durrant
482

Biasanya saya lakukan:

rspec ./spec/controllers/groups_controller_spec.rb:42

Di mana 42mewakili garis tes yang ingin saya jalankan.

EDIT1:

Anda juga bisa menggunakan tag. Lihat di sini .

EDIT 2:

Mencoba:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
apneadiving
sumber
Terima kasih telah mencoba bahwa itu tidak berfungsi ketika saya melakukan rake spec /spec/path...:XX Saya mendapatkan error /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice
Jika saya mencoba menggunakan RSPEC saja, saya mendapatkan kesalahan ini: "$ rspec spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : di `setup ': Anda telah mengaktifkan rspec-core 2.6.2, tetapi Gemfile Anda membutuhkan rspec-core 2.6.0. Pertimbangkan untuk menggunakan bundle exec. (Gem :: LoadError)"
AnApprentice
Anda dapat mencoba "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19" dalam kasus itu
muffinista
eksekutif bundel bekerja tetapi mengapa? Apakah itu peretasan cara untuk menghindarinya?
AnApprentice
11
itu bukan hack, itu memastikan Anda menggunakan versi yang sama seperti yang Anda nyatakan di gemfile Anda. Dalam kasus Anda, yang rspecgagal hanya karena versi pada sistem Anda lebih baru daripada yang ada di gemfile Anda.
apneadiving
67

Dengan menyapu:

rake spec SPEC=path/to/spec.rb

(Penghargaan untuk jawaban ini . Pilih dia.)

EDIT (terima kasih kepada @cirosantilli): Untuk menjalankan satu skenario spesifik dalam spesifikasi, Anda harus menyediakan kecocokan pola regex yang cocok dengan deskripsi.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""
Berikan Birchmeier
sumber
11
Ini adalah jawaban yang unggul karena menggunakan perintah 'rake spec' bukan perintah 'rspec'. Itu berarti database pengujian diinisialisasi ulang dengan benar setiap kali (yang tidak terjadi jika Anda menggunakan 'rspec ...')
jpw
Anda dapat menggunakan SPEC=path/to/spec.rb:42untuk menjalankan tes pada nomor baris yang diberikan, meskipun tampaknya it_behaves_liketes apa pun juga akan dijalankan (bug?).
mgold
61

Anda bisa memberikan regex ke perintah spec yang hanya akan menjalankan itblok yang cocok dengan nama yang Anda berikan.

spec path/to/my_spec.rb -e "should be the correct answer"

Pembaruan 2019: Rspec2 beralih dari perintah 'spec' ke perintah 'rspec'.

Douglas F Shearer
sumber
Terima kasih saya sudah mencoba tetapi ada kesalahan dengan: $ rake spec spec / controllers / incoming_mails_controller_spec.rb -e "seharusnya berhasil dan mengembalikan 3 item" rake dibatalkan! (eval): 1: dalam `standard_rake_options ': compile error (eval): 1: kesalahan sintaks, tIDENTIFIER tak terduga, mengharapkan $ end harus berhasil dan mengembalikan 3 item
AnApprentice
Diperbarui dengan ide file spesifikasi aktual?
AnApprentice
Jika Anda memiliki kesalahan kompilasi, spec Anda bukan ruby ​​yang valid. Pastikan Anda tidak melewatkan dosetelah it, contextatau describedeklarasi.
Douglas F Shearer
1
Ini "spec", bukan "rake spec".
muffinista
ini harus menjadi jawaban yang benar, berkaitan dengan nomor baris adalah salah besar - dalam hal apa pun
Eugen Mayer
27

Ada banyak pilihan:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true
Michael Durrant
sumber
23

Metode pilihan saya untuk menjalankan tes tertentu sedikit berbeda - saya menambahkan baris

  RSpec.configure do |config|
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end

Ke file spec_helper saya.

Sekarang, setiap kali saya ingin menjalankan satu tes khusus (atau konteks, atau spesifikasi), saya cukup menambahkan tag "fokus" ke sana, dan menjalankan pengujian saya seperti biasa - hanya tes yang difokuskan yang akan berjalan. Jika saya menghapus semua tag fokus, run_all_when_everything_filteredtendangan masuk dan menjalankan semua tes seperti biasa.

Ini tidak secepat dan mudah seperti opsi baris perintah - itu memang mengharuskan Anda untuk mengedit file untuk tes yang ingin Anda jalankan. Tapi itu memberi Anda lebih banyak kontrol, saya rasa.

GlyphGryph
sumber
Saya lebih suka gaya ini, karena saya biasanya menjalankan tes melalui Rubymine / intelliJ. Saya suka metode ini juga karena mirip dengan menggunakan fit / xit di melati / dengan tegukan
wired00
9

@memberitahukan jawaban adalah cara yang bagus untuk menyelesaikan ini. Namun, sekarang kami memiliki metode baru di Rspec 3.3. Kita bisa menjalankan rspec spec/unit/baseball_spec.rb[#context:#it]alih-alih menggunakan nomor baris. Diambil dari sini:

RSpec 3.3 memperkenalkan cara baru untuk mengidentifikasi contoh [...]

Sebagai contoh, perintah ini:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … Akan menjalankan contoh atau grup ke-2 dan ke-4 yang ditentukan di bawah grup tingkat atas ke-1 yang ditentukan dalam spec / unit / baseball_spec.rb.

Jadi, alih-alih melakukan di rspec spec/unit/baseball_spec.rb:42mana (tes pada baris 42) adalah tes pertama, kita bisa melakukan rspec spec/unit/baseball_spec.rb[1:1]atau rspec spec/unit/baseball_spec.rb[1:1:1]bergantung pada seberapa bersarangnya test case.

Ingo
sumber
5

Di rel 5,

Saya menggunakan cara ini untuk menjalankan file uji tunggal (semua tes dalam satu file)

rails test -n /TopicsControllerTest/ -v

Nama kelas dapat digunakan untuk mencocokkan dengan file yang diinginkan TopicsControllerTest

Kelasku class TopicsControllerTest < ActionDispatch::IntegrationTest

Output:

masukkan deskripsi gambar di sini

Jika Anda mau, Anda dapat mengubah regex agar sesuai dengan metode pengujian tunggal \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v
Alupotha
sumber
4

Untuk model, itu akan menjalankan kasus pada nomor baris 5 saja

bundle exec rspec spec/models/user_spec.rb:5

Untuk pengontrol: hanya menjalankan case pada nomor baris 5

bundle exec rspec spec/controllers/users_controller_spec.rb:5

Untuk model sinyal atau pengontrol, hapus nomor saluran dari atas

Untuk menjalankan kasing pada semua model

bundle exec rspec spec/models

Untuk menjalankan kasing pada semua pengontrol

bundle exec rspec spec/controllers

Untuk menjalankan semua kasus

 bundle exec rspec 
Sandeep Kapil
sumber
3

Jalankan perintah dari direktori root proyek Anda:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45
Allison
sumber
1

dimulai dengan rspec 2 Anda dapat menggunakan yang berikut:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end
Rudi
sumber
0

Mengingat Anda berada di proyek rails 3 dengan rspec 2, Dari direktori root rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

pasti harus bekerja. Saya bosan mengetik sehingga saya membuat alias untuk mempersingkat 'bundle exec rspec' menjadi 'bersp'

'bundle exec' adalah untuk memuat lingkungan permata yang tepat yang ditentukan dalam file gem Anda: http://gembundler.com/

Rspec2 beralih dari perintah 'spec' ke perintah 'rspec'.

MissingHandle
sumber
0

Saya menggunakan permata penjaga ini untuk menjalankan tes saya secara otomatis. Ini menjalankan tes setelah membuat atau memperbarui operasi pada file uji.

https://github.com/guard/guard-test

atau biasanya Anda dapat menjalankan menggunakan perintah berikut

rspec spec / controllers / groups_controller_spec.rb

Rameshwar Vyevhare
sumber
0

Anda dapat melakukan sesuatu seperti ini:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller
Prabhakar Undurthi
sumber
0

Kamu bisa memakai

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

nomor baris harus nomor baris dari baris 'uraikan' atau 'itu' sehingga akan menjalankan tes yang ada di blok tertentu. alih-alih itu akan menjalankan semua baris di sebelah line_number.

Anda juga dapat membuat blok dengan nama khusus dan kemudian dapat menjalankan blok-blok itu saja.

Akshay Dhobale
sumber
0

Kesalahan umum lainnya adalah masih memiliki atau telah meningkatkan aplikasi Rails yang lebih lama ke Rails 5+ dan menempatkan require 'spec_helper'di bagian atas setiap file tes. Ini harus diubah menjadi require 'rails_helper'. Jika Anda melihat perilaku yang berbeda antara tugas menyapu ( rake spec) dan ketika Anda menjalankan satu spesifikasi ( rspec path/to/spec.rb), ini adalah alasan umum

solusi terbaik adalah

1) pastikan Anda menggunakan require 'rails_helper'di bagian atas dari masing-masing file spesifikasi Anda - bukan gaya lama require 'spec_helper' 2) menggunakan rake spec SPEC=path/to/spec.rbsintaksis

gaya lama yang rspec path/to/spec.rbsaya pikir harus dianggap tidak populer oleh komunitas saat ini pada tahun 2020 (tapi tentu saja Anda akan membuatnya bekerja, selain pertimbangan lain)

Jason FB
sumber