2016-05-15 21 views
2

RSpecでPryを使用しようとしています。 目標はメソッド内でバインディングを破棄してデバッグできることです。RSpecテストで呼び出されたメソッドから起動したときにPryが機能しない

これは私が持っているものです。

のlib/play.rb

class Play 
    def self.hello 
    print 'Hello world!' 
    require 'pry'; binding.pry 
    end 
end 

スペック/ play_spec.rb

require_relative '../lib/play' 

describe Play do 
    it 'Play#hello should print message' do 
    expect {Play.hello}.to output('Hello world!').to_stdout 
    #require 'pry'; binding.pry 
    end 
end 

私はspecファイルに結合コメントを解除し、実行した場合 RSpecの 私は期待通りに動作しているPRYに取得しています

Frame number: 0/23 

From: /Users/iiezhachenko/Documents/Repos/bdd-ruby-  playground/spec/play_spec.rb @ line 6 : 

    1: require_relative '../lib/play' 
    2: 
    3: describe Play do 
    4: it 'Play#hello should print message' do 
    5:  expect {Play.hello}.to output('Hello world!').to_stdout 
=> 6:  require 'pry'; binding.pry 
    7: end 
    8: end 

[1] pry(#<RSpec::ExampleGroups::Play>)> ls 
RSpec::Core::MemoizedHelpers#methods: is_expected should should_not subject 
RSpec::Core::Pending#methods: pending skip 
RSpec::Mocks::ArgumentMatchers#methods: 

私がbinding filを指定した場合lは、テストされ、 "rspec"を再度呼び出すメソッドに入れます。私は完全に混乱しています。

[1] pry(Play)> ls 
[2] pry(Play)> fghjk 
[3] pry(Play)> kweutyalfh 
[4] pry(Play)> exit 
F 

Failures: 

    1) Play Play#hello should print message 
    Failure/Error: expect {Play.hello}.to output('Hello world!').to_stdout 

     expected block to output "Hello world!" to stdout, but output "Hello world!\n\e[1mFrame number:\e[0m 0/32\n\n\e[1mFrom:\e[0m /Users/iiezhachenko/Documents/Repos/bdd-ruby-playground/lib/play.rb @ line 4 Play.hello:\n\n \e[1;34m2\e[0m: \e[32mdef\e[0m \e[1;36mself\e[0m.\e[1;34mhello\e[0m\n \e[1;34m3\e[0m: print \e[31m\e[1;31m'\e[0m\e[31mHello world!\e[1;31m'\e[0m\e[31m\e[0m\n => \e[1;34m4\e[0m: require \e[31m\e[1;31m'\e[0m\e[31mpry\e[1;31m'\e[0m\e[31m\e[0m; binding.pry\n \e[1;34m5\e[0m: \e[32mend\e[0m\n\n\e[0G\e[1m\e[1;34mPlay.methods\e[0m\e[0m: hello\n\e[1m\e[1;34mlocals\e[0m\e[0m: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_\nNameError: undefined local variable or method `fghjk' for Play:Class\nfrom (pry):1:in `hello'\nNameError: undefined local variable or method `kweutyalfh' for Play:Class\nfrom (pry):2:in `hello'\n" 
     Diff: 
     @@ -1,2 +1,17 @@ 
     Hello world! 
     +Frame number: 0/32 
     + 
     +From: /Users/iiezhachenko/Documents/Repos/bdd-ruby-playground/lib/play.rb @ line 4 Play.hello: 
     + 
     + 2: def self.hello 
     + 3: print 'Hello world!' 
     + => 4: require 'pry'; binding.pry 
     + 5: end 
     + 
Play.methods: hello 
     +locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_ 
     +NameError: undefined local variable or method `fghjk' for Play:Class 
     +from (pry):1:in `hello' 
     +NameError: undefined local variable or method `kweutyalfh' for Play:Class 
     +from (pry):2:in `hello' 
    # ./spec/play_spec.rb:5:in `block (2 levels) in <top (required)>' 

誰でもこのような問題に直面しましたか?

+2

あまりにも私を驚かせることはありません。私はRSpecが期待をテストするためにstdout(そして可能なstdin)を取得しなければならないと思います。メインストリームコードから出力ストリームのようなものを抽象化するもう一つの良い理由があります。興味深いもの: –

+0

私はあることを、コードを変更: 仕様/ play_spec.rbは は(Play.hello(3))を期待しています 'それはVARを変更する必要があります" DEF ' end' のlib/play.rbをeqでします。 self.hello(arg) var = 1 「pry」が必要です。 binding.pry 返り値var + arg end' 今すぐPryが正常に動作しました。 しかし、そのような行動の理由は何ですか? それを回避する方法は?私は私のCLIアプリケーションが適切なメッセージを印刷することを確認する必要があります。 – Iezgen

+0

あなたは同時にSTDIN/STDOUTへの読み書きをしている複数のオブジェクトを持っています。その結果、あなたのコンソールには奇妙なものが増えています。 –

答えて

1

testからstdoutキャプチャを削除して解決します。みんな、ありがとう。

関連する問題