Search code examples
ruby-on-railsunit-testingmockingfunctional-testing

How to mock Logger in Rails test using Test::Unit?


In test_helper:

class Logger
    @@log = []

  def self.info(message)
    @@log.push(message)
  end

  def self.log
    @@log
  end
end

But when running the tests it seems to use the regular Logger.

How to create a mock for the Logger?

Rails 3.0.7.


Solution

  • You need to assign your logger to the Rails.logger for Rails to use it... For you to fully implement logger, you need to implement all of the methods http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html (namely #debug, #warn, #error, #fatal)

    ENV["RAILS_ENV"] = "test"
    require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
    
    class Logger
        @@log = []
    
      def self.info(message)
        @@log.push(message)
      end 
    
      def self.log
        @@log
      end 
    end
    
    
    class TestLogCase < ActiveSupport::TestCase
      def setup
        Rails.logger = Logger
      end 
    
      test "records the log" do
        Rails.logger.info "My Message"
        assert_true Logger.log.include?("My Message")
      end                                                                                                                         
    end