2011-11-23 66 views
2

我喜並試圖RSPEC模擬以下類:如何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: (Double "Rails.logger").debug(any args)
expected: 1 time
received: 0 times

任何幫助將是偉大的!

回答

4

我會怎麼做:

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

不要忘記在測試結束做unstub:

Rails.unstub(:logger) 
+0

這並不爲我工作。我得到了'未定義的方法'stub_chain'for Rails:Module(NoMethodError)' – tamouse

1

存根沒有奏效,因爲那些存根都沒有聯繫真實的代碼。它應該是這樣的,而不是:

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 }