5551


RSpecのテスト中に`binding.pry`で変数の状態などを確認できるように`pry-
byebug`を入れて使ってみたのですが、`binding.pry`を入れておいたメソッドが複数のテストから呼ばれていると、そのテストのたびに全て止まってしまい、何度も`exit`を入力しなければすべてのテストを終えれませんでした。

特定のテストでだけ`binding.pry`を有効にするにはどうすればよいのでしょうか？

以下に例を示しておきます。

### Classファイル

[code]

    class Post
      def foo
        binding.pry
        # do something
        return nil
      end
    
      def bar
        # foo を呼び出して何かする
      end
    end
    
[/code]

### Specファイル

[code]

    let(:post){ Post.create }
    
    describe ".foo" do
      it do
        expect(post.foo).to be nil
      end
    end
    
    describe ".bar" do
      it do
        expect(post.bar).to be 1
      end
    end
    
[/code]

この時に一つ目のテストでは`binding.pry`で止まるけども、2つ目のテストでは止めずに処理を続行させたいと思っています。


CC BY-SA 3.0
2015-01-29T03:19:55.387
5549
2015-01-29T04:40:52.133
3271
question
ruby ruby-on-rails rspec
RSpecの特定のテストの時にだけbinding.pryで動作を確認する


特定のテストだけを実行するとよいのではないでしょうか。

[code]

    describe ".foo", focus: true do
      it do
        expect(post.foo).to be nil
      end
    end
    
[/code]

このように`focus`でタグ付けすることで、`focus`でタグ付けされたテストのみを実行することが出来ます。

参考: [inclusion filters - Filtering - RSpec Core - RSpec -
Relish](https://relishapp.com/rspec/rspec-core/v/3-1/docs/filtering/inclusion-
filters)

また、コマンドラインでRSpecを実行する際にファイル名の後ろに`:`で区切って行番号を指定することで、その行のexampleのみを実行することも出来ます。

[code]

    $ rspec spec/foobar_spec.rb:3
    
[/code]

参考: [line number appended to file path - Command line - RSpec Core - RSpec -
Relish](https://relishapp.com/rspec/rspec-core/v/3-1/docs/command-line/line-
number-appended-to-file-path)

あるいは次の様な設定を追加して`pry_debug`でタグ付けしたテスト以外では`binding.pry`をstubするとよいのではないでしょうか。

[code]

    RSpec.configure do |config|
      config.before do |example|
        unless example.metadata[:pry_debug]
          allow_any_instance_of(Binding).to receive(:pry)
        end
      end
    end
    
[/code]

[code]

    describe ".foo", pry_debug: true do
      it do
        expect(post.foo).to be nil
      end
    end
    
[/code]


CC BY-SA 3.0
2015-01-29T04:26:05.863
5551
2015-01-29T04:26:05.863
2599
5549
answer


Seiei Higaさんの回答に便乗しますが、pryを無効化する場合は `ENV['DISABLE_PRY'] = 'true'`
のようにすると良いみたいです。

なので、こんな感じにするとうまくいくかもしれません。

[code]

    RSpec.configure do |config|
      config.before do |example|
        ENV['DISABLE_PRY'] = example.metadata[:disable_pry] ? 'true' : nil
      end
    end
    
[/code]

[code]

    let(:post){ Post.create }
    
    describe ".foo" do
      it do
        expect(post.foo).to be nil
      end
    end
    
    describe ".bar", disable_pry: true do
      it do
        expect(post.bar).to be 1
      end
    end
    
[/code]

実際には試していないのでうまくいかなかった場合は悪しからず。。。

参考文献

  * <https://stackoverflow.com/questions/8015531/how-do-i-step-out-of-a-loop-with-ruby-pry>


CC BY-SA 3.0
2015-01-29T04:40:52.133
5553
2015-01-29T04:40:52.133
2017-05-23T12:38:56.083
-1
85
5549
answer