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.