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


306

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

/spec/controllers/groups_controller_spec.rb

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

私のgemファイル:

# 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
Zoric

bundle exec rspec spec --helpウィルはあなたに答えを与えます:
トーマス・

回答:


15

これがどのくらいの期間利用可能かわからないが、実行フィルタリング用の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_when_matching-instance_method


1
これには、インフラストラクチャの変更が必要です。そして、元に戻すことを忘れないでください。私はこれを行わず、rspec適切なパラメーターを指定してスペックを実行するコマンドのみを使用して、どれを示すかを推奨します
Michael Durrant

482

通常私はします:

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...: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 : `setup ':すでにrspec-core 2.6.2をアクティブ化していますが、Gemfileにはrspec-core 2.6.0が必要です。バンドルexecの使用を検討してください(Gem :: LoadError)"
AnApprentice

その場合は、「バンドルexec rspec spec / controllers / groups_controller_spec.rb:19」を試すことができます
muffinista

bundle execは機能しましたが、なぜですか?それはそれを避けるためのハックですか?
AnApprentice、

11
これはハックではなく、gemfileで宣言したものとまったく同じバージョンを使用するようにします。あなたの場合、rspecあなたのシステムのバージョンがあなたのgemfileのバージョンよりも新しいので、単に失敗しました。
11年

67

レーキあり:

rake spec SPEC=path/to/spec.rb

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

編集(@cirosantilliに感謝):仕様内で特定のシナリオを1つ実行するには、説明と一致する正規表現パターンマッチを指定する必要があります。

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

11
これは、「rspec」コマンドではなく「rake spec」コマンドを使用するため、優れた答えです。つまり、テストデータベースは毎回適切に再初期化されます( 'rspec ...'を使用した場合は発生しません)
jpw

を使用SPEC=path/to/spec.rb:42して、指定された行番号でテストを実行できますが、テストit_behaves_likeも実行されるようです(バグ?)。
mgold 2015年

61

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

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

2019アップデート:Rspec2が「spec」コマンドから「rspec」コマンドに切り替わりました。


おかげで試してみましたが、次のエラーが発生しました:$ rake spec spec / controllers / incoming_mails_controller_spec.rb -e「成功するはずで、3つのアイテムを返す必要があります」rakeは中止されました!(eval):1:in `standard_rake_options ':コンパイルエラー(eval):1:構文エラー、予期しないtIDENTIFIER、$ endが成功して3つのアイテムを返すことを期待
AnApprentice

実際のスペックファイルのアイデアで更新しましたか?
AnApprentice、

コンパイルエラーがある場合、仕様は有効なルビではありません。あなたが欠落していないことを確認してくださいdoitcontextまたはdescribe宣言の後の。
ダグラスFシアラー

1
これは「仕様」であり、「レーキ仕様」ではありません。
マフィニスタ

これは正しい答えである必要があります。行番号に関しては深刻な誤りです-どのような場合でも
オイゲン・メイヤー

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を介して通常テストを実行しているので、私は間違いなくこのスタイルを好みます。Iこの方法のようにも、ゴクゴクと/ジャスミンでフィット/ 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] …2番目と4番目の例、またはspec / unit / baseball_spec.rbで定義されている1番目の最上位グループの下に定義されているグループを実行します。

だから、代わりに行うの 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では

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

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 

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

'bundle exec'は、gemファイルで指定された正確なgem環境をロードするためのものです。http//gembundler.com/

Rspec2が「spec」コマンドから「rspec」コマンドに切り替わりました。



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>

行番号は、その特定のブロックに存在するテストを実行できるように、「記述」または「それ」の行番号でなければなりません。代わりに、line_numberの次のすべての行を実行します。

また、カスタム名でブロックを作成して、それらのブロックのみを実行することもできます。


0

もう1つのよくある間違いは、古いRailsアプリをまだ持っているか、Rails 5以降にアップグレードして、require 'spec_helper'各テストファイルの先頭に置くことです。これはに変更されrequire 'rails_helper'ます。rakeタスク(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.rb2020年の現時点では、コミュニティは流行から外れていると考えるべき古いスタイルです(もちろん、それを機能させることもできますが、その他の考慮事項は別として)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.