Tek bir RSpec testi nasıl yapılır?


306

Aşağıdaki dosya var:

/spec/controllers/groups_controller_spec.rb

Terminalde hangi komutu sadece bu özelliği çalıştırmak için kullanırım ve hangi dizinde komutu çalıştırırım?

Gem dosyam:

# 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

Spec dosyası:

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

Testlerinizi paket yürütme rspec ./spec/controllers/groups_controller_spec.rb:6 gibi çalıştırabilirsiniz, sadece bu belirli testi çalıştırır. Daha fazla bilgi için: kolosek.com/rails-rspec-setup
— Nesha Zoric

bundle exec rspec spec --helpsize cevap vereceğim:
— Thomas Decaux

Yanıtlar:


15

Bunun ne kadar süredir kullanılabilir olduğundan emin değilsiniz, ancak çalışma filtrelemesi için bir Rspec yapılandırması var - şimdi bunu aşağıdakilere ekleyebilirsiniz spec_helper.rb:

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

Ardından it, contextveya describeyalnızca bu bloğu çalıştırmak için bir odak etiketi ekleyin :

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

RSpec belgeleri:

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


1
Bu, değişen altyapıyı gerektirir. Ve geri değiştirmeyi hatırlamak. Bunu yapmamanızı ve sadece rspecbelirtmek için uygun parametreleri kullanarak spesifikasyonu çalıştırmak için komutları kullanmanızı tavsiye ederim
— Michael Durrant

482

Genellikle yaparım:

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

Burada 42koşmak istediğim testin çizgisini temsil ediyor.

Edit1:

Etiketleri de kullanabilirsiniz. Buraya bakın .

DÜZENLEME 2:

Deneyin:

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

Teşekkürler, komisyon spec /spec/path...:XX yaptığımda çalışmıyor denedim /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

Ben sadece RSPEC kullanmayı denerseniz, bu hatayı alıyorum: "$ rspec spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : `` setup '' içinde: rspec-core 2.6.2'yi zaten etkinleştirdiniz, ancak Gemfile'ınız rspec-core 2.6.0 gerektiriyor. Bundle exec kullanmayı düşünün. (Gem :: LoadError) "
— AnApprentice

Bu durumda "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19"
— komutunu deneyebilirsiniz

paket exec çalıştı ama neden? Bundan kaçınmanın bir yolu var mı?
— 01

11
bu bir hack değil, gemfile'ınızda beyan ettiğiniz sürümü kullandığınızdan emin olur. Sizin durumunuzda, rspecsisteminizdeki sürüm gemfile'dekinden daha yeni olduğu için sadece başarısız oldu.
— apneadiving

67

Tırmıkla:

rake spec SPEC=path/to/spec.rb

(Kredi bu cevaba gider . Git ona oy ver.)

DÜZENLEME (@cirosantilli sayesinde): Spesifikasyon içinde belirli bir senaryoyu çalıştırmak için, açıklamayla eşleşen bir normal ifade modeli sağlamanız gerekir.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
Bu üstün yanıttır, çünkü 'rspec' komutunu değil 'rake spec' komutunu kullanır. Bu, test veritabanının her seferinde doğru şekilde yeniden başlatıldığı anlamına gelir ('rspec ...' kullanırsanız gerçekleşmez)
— jpw

Sen kullanabilirsiniz SPEC=path/to/spec.rb:42herhangi görünse de, belirli bir satır numarasına testi çalıştırmak için it_behaves_liketestler da yayınlanmaya alacak (bug?).
— mgold

61

Spec komutuna yalnızca itsağladığınız adla eşleşen blokları çalıştıracak bir normal ifade iletebilirsiniz .

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

2019 Güncellemesi: Rspec2 'spec' komutundan 'rspec' komutuna geçti.


Teşekkürler ben denedim ama ile hatalar: $ komisyon spec spec / kontrolörleri / incoming_mails_controller_spec.rb -e "başarılı olmalı ve 3 ürün iade" komisyon iptal edildi! (eval): 1: `standard_rake_options 'da: derleme hatası (eval): 1: sözdizimi hatası, beklenmeyen tIDENTIFIER, $ end'in başarılı olması ve 3 öğe döndürmesi gerekir
— AnApprentice

Gerçek spec dosyası fikirleri ile güncellendi?
— AnApprentice

Derleme hatası varsa, spesifikasyonunuz geçerli ruby ​​değil. Emin bir eksik değil emin olun dobir sonraki it, contextya describebildiri.
— Douglas F Shearer

1
Bu "spec", "komisyon spec" değil.
— muffinista

bu doğru bir cevap olmalı, bir satır numarası ile ilgili ciddi yanlış - her durumda
— Eugen Mayer

27

Birçok seçenek var:

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

23

Belirli testler yapmak için tercih ettiğim yöntem biraz farklı - satırları ekledim

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

Spec_helper dosyama.

Şimdi, belirli bir testi (veya bağlamı veya spesifikasyonu) çalıştırmak istediğimde, ona "odak" etiketini ekleyebilir ve testimi normal olarak çalıştırabilirim - sadece odaklanmış testler çalışacaktır. Tüm odak etiketlerini kaldırırsam, run_all_when_everything_filteredtüm testleri normal şekilde başlatır ve çalıştırır.

Komut satırı seçenekleri kadar hızlı ve kolay değildir - çalıştırmak istediğiniz test için dosyayı düzenlemenizi gerektirir. Ama bu size çok daha fazla kontrol sağlıyor, hissediyorum.


Bu stili kesinlikle tercih ediyorum, çünkü genellikle Rubymine / intelliJ aracılığıyla testler yapıyorum. Ben de bu yöntemi seviyorum çünkü onun yasemin /
— gulp

9

@apneadiving cevabı bunu çözmenin düzgün bir yoludur. Ancak, şimdi Rspec 3.3'te yeni bir yöntemimiz var. rspec spec/unit/baseball_spec.rb[#context:#it]Bir satır numarası kullanmak yerine basitçe çalışabiliriz . Alındığı burada:

RSpec 3.3 örnekleri tanımlamak için yeni bir yol sunuyor [...]

Örneğin, bu komut:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … Spec / unit / baseball_spec.rb'de tanımlanan 1. üst düzey grup altında tanımlanan 2. ve 4. örnek veya grubu çalıştırır.

Bunun yerine yapmanın rspec spec/unit/baseball_spec.rb:42o (hat 42 test) ilk test olduğu, biz sadece yapabiliriz rspec spec/unit/baseball_spec.rb[1:1]veya rspec spec/unit/baseball_spec.rb[1:1:1]test durumda nasıl iç içe bağlı.


5

Raylarda 5,

Tek bir test dosyası (tüm testler tek bir dosyada) çalıştırmak için bu şekilde kullandım

rails test -n /TopicsControllerTest/ -v

Sınıf adı istenilen dosyayla eşleşmek için kullanılabilir TopicsControllerTest

Sınıfım class TopicsControllerTest < ActionDispatch::IntegrationTest

Çıktı :

resim açıklamasını buraya girin

İsterseniz normal ifadeyi tek bir test yöntemiyle eşleştirmek için düzenleyebilirsiniz \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

Model için, durumu yalnızca 5 numaralı satırda çalıştıracaktır

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

Denetleyici için: yalnızca 5 numaralı satırda çalışacak

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

Sinyal modeli veya kontrolör için satır numarasını yukarıdan kaldırın

Tüm modellerde vaka çalıştırmak için

bundle exec rspec spec/models

Tüm denetleyicide kasa çalıştırmak için

bundle exec rspec spec/controllers

Tüm vakaları çalıştırmak için

 bundle exec rspec 

3

Projenizin kök dizininden komutları çalıştırın:

# 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

1

rspec 2 ile başlayarak aşağıdakileri kullanabilirsiniz:

# 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

0

Rspec 2 ile bir raylar 3 projesinde olduğunuz göz önüne alındığında, raylar kök dizininden:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

kesinlikle çalışmalı. i 'bersp' için 'paket exec rspec' kısaltmak için bir diğer ad oluşturdu yazarak bıktım

'bundle exec', gem dosyanızda belirtilen tam değerli taş ortamını yükleyecek şekilde: http://gembundler.com/

Rspec2 'spec' komutundan 'rspec' komutuna geçti.


0

Testimi otomatik olarak çalıştırmak için bu koruma taşını kullanıyorum. Test dosyasındaki işlemleri oluşturduktan veya güncelledikten sonra testi yürütür.

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

veya genellikle aşağıdaki komutu kullanarak çalıştırabilirsiniz

rspec spec / denetleyiciler / groups_controller_spec.rb


0

Bunun gibi bir şey yapabilirsiniz:

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

0

Kullanabilirsiniz

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

satır numarası 'tanımla' veya 'bu' satırlarının satır numarası olmalıdır, böylece o blokta mevcut testleri çalıştırabilir. bunun yerine line_number öğesinin yanındaki tüm satırları yürütür.

ayrıca özel adla blok oluşturabilir ve daha sonra sadece bu blokları yürütebilirsiniz.


0

Başka bir yaygın hata, eski bir Rails uygulamasını hala Rails 5+ sürümüne yükseltmek veya yükseltmek ve require 'spec_helper'her test dosyasının başına koymaktır. Bu olarak değiştirilmelidir require 'rails_helper'. Komisyon görevi ( rake spec) arasında farklı bir davranış görüyorsanız ve tek bir spec ( rspec path/to/spec.rb) çalıştırdığınızda , bu yaygın bir nedendir

en iyi çözüm

1) require 'rails_helper'spec dosyalarınızın her birinin üstünde kullandığınızdan emin olun (eski stili değil require 'spec_helper' ) 2 rake spec SPEC=path/to/spec.rbsözdizimini kullanın

rspec path/to/spec.rbsanırım eski tarz 2020'de topluluk tarafından modası geçmiş olarak düşünülmelidir (ama elbette işe yarayacaksınız, diğer düşünceler bir yana)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.