[ruby-on-rails] 단일 RSpec 테스트를 실행하는 방법은 무엇입니까?

다음 파일이 있습니다.

/spec/controllers/groups_controller_spec.rb

해당 스펙 만 실행하기 위해 터미널에서 어떤 명령을 사용하며 어떤 디렉토리에서 명령을 실행합니까?

내 보석 파일 :

# 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

사양 파일 :

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



답변

사용 가능한 시간이 얼마인지 확실하지 않지만 실행 필터링을위한 Rspec 구성이 있으므로 이제이를 다음에 추가 할 수 있습니다 spec_helper.rb.

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

그리고 다음에 초점 태그를 추가 it, context또는 describe해당 블록을 실행합니다 :

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

RSpec 문서 :

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


답변

보통 나는한다 :

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

어디 42내가 실행할 검사의 라인을 나타냅니다.

편집 1 :

태그를 사용할 수도 있습니다. 여기를 참조 하십시오 .

편집 2 :

시험:

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


답변

갈퀴로 :

rake spec SPEC=path/to/spec.rb

(크레딧은 이 답변으로 갑니다 . 투표 해주세요.)

편집 (@cirosantilli 덕분에) : 사양 내에서 하나의 특정 시나리오를 실행하려면 설명과 일치하는 정규식 패턴 일치를 제공해야합니다.

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


답변

정규식을 spec 명령에 전달하면 it지정한 이름과 일치하는 블록 만 실행됩니다 .

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

2019 업데이트 : Rspec2가 ‘spec’명령에서 ‘rspec’명령으로 전환되었습니다.


답변

많은 옵션이 있습니다 :

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


답변

특정 테스트를 실행하기 위해 선호하는 방법은 약간 다릅니다.

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

내 spec_helper 파일로.

이제 하나의 특정 테스트 (또는 컨텍스트 또는 스펙)를 실행하려고 할 때마다 “focus”태그를 추가하고 정상적으로 테스트를 실행할 수 있습니다. 집중된 테스트 만 실행됩니다. 모든 포커스 태그를 제거하면run_all_when_everything_filtered 정상적으로 모든 테스트가 시작되고 실행됩니다.

명령 행 옵션만큼 쉽고 빠르지는 않습니다. 실행할 테스트 파일을 편집해야합니다. 그러나 그것은 당신에게 훨씬 더 많은 통제권을줍니다.


답변

@apneadiving 답변은 ​​이것을 해결하는 깔끔한 방법입니다. 그러나 이제 Rspec 3.3에 새로운 방법이 있습니다. rspec spec/unit/baseball_spec.rb[#context:#it]줄 번호를 사용하는 대신 간단히 실행할 수 있습니다. 여기 에서 찍은 :

RSpec 3.3은 예제를 식별하는 새로운 방법을 소개합니다 …]

예를 들어이 명령은 다음과 같습니다.

$ rspec spec/unit/baseball_spec.rb[1:2,1:4]
… spec / unit / baseball_spec.rb에 정의 된 첫 번째 최상위 그룹에 정의 된 두 번째 및 네 번째 예 또는 그룹을 실행합니다.

그래서 그 대신 일의
rspec spec/unit/baseball_spec.rb:42그것 (라인 42 테스트) 첫 번째 테스트이고, 우리는 간단하게 할 수있는
rspec spec/unit/baseball_spec.rb[1:1]또는 rspec spec/unit/baseball_spec.rb[1:1:1]테스트 케이스가 얼마나 중첩에 따라 달라집니다.