단일 RSpec 테스트를 실행하는 방법은 무엇입니까?


306

다음 파일이 있습니다.

/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

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6과 같은 테스트를 실행할 수 있으며이 특정 테스트 만 실행합니다. 여기에 더 많은 정보 : kolosek.com/rails-rspec-setup
— Nesha Zoric

bundle exec rspec spec --help윌 당신에게 답변을 제공합니다 :
— 토마스 Decaux

답변:


15

사용 가능한 시간이 얼마인지 확실하지 않지만 실행 필터링을위한 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


1
인프라 변경이 필요합니다. 그리고 그것을 다시 바꾸는 것을 기억하십시오. 나는이 일을 그냥 사용하지 않는 것이 좋습니다 rspec나타 내기 위해 적절한 매개 변수를 사용하여 사양을 실행하는 명령을하는
— 마이클 듀런트

482

보통 나는한다 :

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

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

편집 1 :

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

편집 2 :

시험:

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

고맙습니다 사양 /spec/path...:XX 긁을 때 작동하지 않는다고 시도했습니다 ./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

RSPEC 만 사용하려고하면 "$ rspec spec / controllers / groups_controller_spec.rb : 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 오류가 발생합니다. : in`setup ': 이미 rspec-core 2.6.2를 활성화했지만 Gemfile에 rspec-core 2.6.0이 필요합니다. 번들 실행 사용 (Gem :: LoadError) "
— AnApprentice

이 경우 "bundle exec rspec spec / controllers / groups_controller_spec.rb : 19"를 시도해보십시오
— muffinista

번들 exec가 작동했지만 왜? 그것을 피할 수있는 방법이 있습니까?
— AnApprentice

11
그것은 해킹이 아니며 gemfile에서 선언 한 것과 동일한 버전을 사용해야합니다. 귀하의 경우 rspec시스템의 버전이 gemfile의 버전보다 최신 버전이기 때문에 실패했습니다.
— apneadiving

67

갈퀴로 :

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\""

11
이것은 'rspec'명령이 아닌 'rake spec'명령을 사용하기 때문에 탁월한 대답입니다. 즉, 테스트 데이터베이스가 매번 제대로 다시 초기화됨을 의미합니다 ( 'rspec ...'을 사용하면 발생하지
— 않음

SPEC=path/to/spec.rb:42주어진 줄 번호에서 테스트를 실행하는 데 사용할 수 있지만 it_behaves_like테스트가 실행되는 것처럼 보입니다 (버그?).
— mgold

61

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

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

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


고맙지 만 나는 그것을 시도했지만 오류 : $ 레이크 사양 spec / controllers / incoming_mails_controller_spec.rb -e "성공해야하고 3 항목을 반환해야합니다"레이크가 중단되었습니다! (eval) : 1 :`standard_rake_options ': 컴파일 오류 (eval) : 1 : 구문 오류, 예기치 않은 tIDENTIFIER, $ end가 성공하고 3 개의 항목을 반환해야 함
— AnApprentice

실제 사양 파일 아이디어로 업데이트 되었습니까?
— AnApprentice

컴파일 오류가 발생하면 스펙이 유효한 루비가 아닙니다. 확실히 당신은 누락되지 않습니다 확인 do후 it, context또는 describe선언.
— Douglas F Shearer

1
"rake spec"이 아니라 "spec"입니다.
— muffinista

이것은 라인 번호와 관련하여 정답이어야합니다. 어쨌든
— Eugen Mayer

27

많은 옵션이 있습니다 :

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

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

  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 정상적으로 모든 테스트가 시작되고 실행됩니다.

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


Rubymine / intelliJ를 통해 일반적으로 테스트를 실행하기 때문에이 스타일을 선호합니다. 나는이 방법도 좋아한다. 재스민에서 / fit과 xit을 사용하는 것과 비슷하기 때문이다
— wired00

9

@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]테스트 케이스가 얼마나 중첩에 따라 달라집니다.


5

레일 5에서

이 방법으로 단일 테스트 파일을 실행했습니다 (모든 파일을 하나의 파일로)

rails test -n /TopicsControllerTest/ -v

클래스 이름을 사용하여 원하는 파일과 일치시킬 수 있습니다 TopicsControllerTest

내 수업 class TopicsControllerTest < ActionDispatch::IntegrationTest

출력 :

여기에 이미지 설명을 입력하십시오

단일 테스트 방법과 일치하도록 정규식을 조정할 수 있습니다 \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

모델의 경우 5 번 줄에서만 실행됩니다.

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

컨트롤러 : 라인 번호 5에서만 실행됩니다.

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

신호 모델 또는 컨트롤러의 경우 위의 라인 번호를 제거하십시오

모든 모델에서 사례를 실행하려면

bundle exec rspec spec/models

모든 컨트롤러에서 사례를 실행하려면

bundle exec rspec spec/controllers

모든 경우를 실행하려면

 bundle exec rspec 

3

프로젝트의 루트 디렉토리에서 명령을 실행하십시오.

# 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로 시작하면 다음을 사용할 수 있습니다.

# 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를 사용하는 rails 3 프로젝트 인 경우 rails 루트 디렉토리에서 :

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

분명히 작동해야합니다. 타이핑하는 데 지쳤으므로 '번들 exec rspec'을 'bersp'로 단축하는 별칭을 만들었습니다.

'bundle exec'는 gem 파일에 지정된 정확한 gem 환경을로드하기위한 것입니다. http://gembundler.com/

Rspec2가 'spec'명령에서 'rspec'명령으로 전환되었습니다.


0

이 가드 젬을 사용하여 테스트를 자동 실행합니다. 테스트 파일에서 생성 또는 업데이트 작업 후 테스트를 실행합니다.

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

또는 일반적으로 다음 명령을 사용하여 실행할 수 있습니다

rspec 사양 / 제어기 /groups_controller_spec.rb


0

다음과 같이 할 수 있습니다 :

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

0

당신이 사용할 수있는

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

라인 번호는 특정 블록에 존재하는 테스트를 실행하기 위해 '설명'또는 'it'라인의 라인 번호 여야합니다. 대신 line_number 옆의 모든 행을 실행합니다.

또한 사용자 정의 이름으로 블록을 작성한 다음 해당 블록 만 실행할 수 있습니다.


0

또 다른 일반적인 실수는 여전히 이전 Rails 앱을 Rails 5+로 업그레이드했거나 업그레이드하여 require 'spec_helper'각 테스트 파일의 맨 위에 놓는 것 입니다. 로 변경되어야합니다 require 'rails_helper'. 갈퀴 작업 ( rake spec)과 단일 사양 (rspec path/to/spec.rb ) 이 나타나는 것이 일반적인 이유입니다.

가장 좋은 해결책은

1) require 'rails_helper'이전 사양이 아닌 각 사양 파일의 맨 위에 사용 하고 있는지 확인하십시오. require 'spec_helper' 2)rake spec SPEC=path/to/spec.rb 구문을

rspec path/to/spec.rb내가 생각 하는 구식 스타일 은 2020 년에 현재 커뮤니티에서 모호한 것으로 간주되어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.