2016-07-25 17 views
3

This questionは、RSpecモデルとコントローラの仕様からロガーステートメントをテストする方法を教えてくれます。残念ながら、それは機能仕様からは機能していないようです。このコードでは:Rspec機能仕様からRailsログをテストするにはどうすればよいですか?

# controller.rb 
def action 
    logger.info 'foobar' 
end 

# spec.rb 
scenario 'logging should work' do 
    expect(Rails.logger).to receive(:info).with('foobar') 
    visit action_path 
end 

私はエラーを取得する:

Failure/Error: visit action_path 
    #<ActiveSupport::Logger:0x007ff45b6e5ad0> received :info with unexpected arguments 
    expected: ("foobar") 
      got: (no args) 

test.logファイルがfoobarが含まれていないので、コントローラのアクションが完了する機会を持つ前に、テストがすぐに失敗しているようです。

フィーチャー仕様でこのexpect(Rails.logger)構文を使用する方法はありますか?

+0

任意の答えは? – mooreds

+0

この回答を利用できます:http://stackoverflow.com/questions/11770552/how-to-get-rails-logger-printing-to-the-console-stdout-when-running-rspec/32628272#32628272 – mooreds

答えて

0

Rails.logger.info methodは、文字列またはブロックを使用できます。あなたがブロックフォームを呼び出しているなら、この "got :(引数なし)"の出力を与えるでしょう。例

logger.info 'foobar' 

については

... 1本のライン上のすべての文字列での.info呼びますが、あなたは括弧なしで2行に

logger.info 
    "foobar foobar longer message so I'll put it on its own line" 

分割を行う場合は、あなたがしています実際にブロックを通過します。角かっこを追加してください...

logger.info(
    "foobar foobar longer message so I'll put it on its own line" 
) 

...あなたは文字列に戻ります。

彼は故意にそれを実現する前に

:-)数時間、この問題に頭をバッシングした後、私はRails.loggerクラスをモックする方法を考え出す始めたと言います。それはあなたや他の人にとって便利なアプローチかもしれません。たぶんあなたは何らかの理由でブロックを呼び出しているかもしれません(機能対コントローラの仕様と関係があるでしょうか?)、そうでなければ呼び出しコードを変更することはできません。このようなものは有用な出発点かもしれません:

class LoggerMock < Object 
    def initialize; end 

    def info(progname = nil, &block) 
    mock_info(block.call) 
    end 
end 

、ここ

logger_mock = LoggerMock.new 
allow(Rails).to receive(:logger).and_return(logger_mock) 
expect(logger_mock).to receive(:mock_info).with('foobar') 
関連する問題