2016-07-25 81 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' 

...都在同一行會叫的.info一個字符串,但如果你在兩行

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')