단일 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

컴파일 오류가 발생하면 스펙이 유효한 루비가 아닙니다. 확실히 당신은 누락되지 않습니다 확인 doit, 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.