Как rspec макет рубиновый рельс - PullRequest
2 голосов
/ 24 ноября 2011

Привет, я и rspec пытаюсь издеваться над следующим классом:

    class Person
      def initialize(personid)
        Rails.logger.debug "Creating person with id #{personid}"
      end
    end

Используя это:

require 'spec_helper'
  describe Person do
    describe "#initialize" do
      let(:rails_mock) { double("Rails").as_null_object }
      let(:logger_mock) { double("Rails.logger").as_null_object }

      it "logs a message" do
        rails_mock.stub(:logger).and_return(logger_mock)
        logger_mock.should_receive(:debug)
        Person.new "dummy"
      end
   end
end

и получаю это сообщение:

RSpec :: Mocks :: MockExpectationError: (Двойной "Rails.logger"). Debug (любые аргументы)
ожидается: 1 раз
получил: 0 раз

Любая помощь будет отличной!

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Я бы сделал:

Rails.stub_chain(:logger, :debug).and_return(logger_mock)

Не забудьте сделать unstub в конце теста:

Rails.unstub(:logger)
1 голос
/ 10 июня 2013

Заглушка не работает, потому что эти заглушки не связаны с реальным кодом.Вместо этого это должно быть так:

require 'spec_helper'
  describe Person do
    describe "#initialize" do
      let(:logger_mock) { double("Rails.logger").as_null_object }

      it "logs a message" do
        Rails.stub(:logger).and_return(logger_mock)
        logger_mock.should_receive(:debug)
        Person.new "dummy"
      end
   end
end

Для OP: если вы просто хотите установить ожидание при ведении журнала, вам вообще не нужно заглушать весь класс средства ведения журнала.Вы можете просто сделать

Rails.logger.should_receive(:debug)

Бонус: если вы просто хотите заглушки, чтобы не происходила регистрация, сделайте это:

Rails.logger.stub(:add){ true }
...