web-dev-qa-db-ja.com

単一のRSpecテストを実行する方法

次のファイルがあります。

/spec/controllers/groups_controller_spec.rb

そのスペックだけを実行するためにterminalでどのコマンドを使用し、どのディレクトリでコマンドを実行しますか?

私の宝石ファイル:

# 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
278
AnApprentice

どれぐらいの間これが利用可能になったのかわからないが、実行フィルタリングのためのRspec設定がある - それで今これをあなたのspec_helper.rbに追加することができる:

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

そして、itcontextまたはdescribeにフォーカスタグを追加して、そのブロックのみを実行します。

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

RSpecのドキュメント:

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

3
emc

通常私はします:

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

42は実行したいテストの行を表します。

編集1:

タグを使うこともできます。 ここ を参照してください。

編集2:

試してください:

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

熊手で:

rake spec SPEC=path/to/spec.rb

(クレジットは この回答 になります。彼に投票してください。)

EDIT(@cirosantilliのおかげで):仕様内で特定のシナリオを1つ実行するには、説明と一致する正規表現パターン一致を提供する必要があります。

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

Specコマンドに正規表現を渡すと、指定した名前に一致するitブロックのみが実行されます。

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

多くの選択肢があります。

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
24
Michael Durrant

特定のテストを実行するための私の好ましい方法は少し異なります - 私は行を追加しました

  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が起動し、すべてのテストが通常どおり実行されます。

コマンドラインオプションほど速くて簡単というわけではありません - 実行したいテスト用にファイルを編集する必要があります。しかし、それはあなたにより多くのコントロールを与えます、と私は感じます。

23
GlyphGryph

@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で定義されている最初の最上位グループの下に定義されている2番目と4番目の例またはグループを実行します。

そのため、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]を実行できます。

6
Ingo

Rails 5では、

私はこの方法で単一のテストファイル(すべてのテストを1つのファイルにまとめて)を実行しました。

Rails test -n /TopicsControllerTest/ -v

クラス名を使用して目的のファイルに一致させることができますTopicsControllerTest

私のクラスclass TopicsControllerTest < ActionDispatch::IntegrationTest

出力:

enter image description here

必要に応じて、単一のテストメソッド\TopicsControllerTest#test_Should_delete\に合わせて正規表現を微調整できます。

Rails test -n /TopicsControllerTest#test_Should_delete/ -v
3
Alupotha

モデルの場合、行番号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 
1
Sandeep Kapil

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
1
Rudi

私は自分のテストを自動実行するためにこのguard gemを使います。テストファイルの作成または更新操作後にテストを実行します。

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

または通常は、次のコマンドを使用して実行できます。

rspec spec/controllers/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
Prabhakar

Rails 3プロジェクトでrspec 2を使用している場合、Railsのルートディレクトリから。

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

間違いなく動作するはずです。それを入力するのに飽きたので、 'bundle exec rspec'を 'bersp'に短縮するエイリアスを作成しました。

'bundle exec'は、あなたのgemファイルで指定された正確なgem環境をロードするようになっています。 http://gembundler.com/

Rspec2は 'spec'コマンドから 'rspec'コマンドに切り替えました。

0
MissingHandle