2015-04-03 184 views
0

我在測試我的類的初始化方法。它調用一個私有方法,並由於某種原因該方法失敗。Rspec私有方法無法訪問類實例變量?

類(簡化爲簡潔的代碼):

class MyClass 
    @configs = {} 

    def initialize(configs) 
    @configs = configs 
    check_configs 
    create_client 
    end 

private 

def check_configs 
    if @configs['some_token'].nil? 
     Rails.logger.git_loader.error('log message') 
     raise AnError 
    end 
end 

end 

測試:

describe '#initialize' do 
    let(:config) { my_token: '123-FakeToken' } 
    let(:loader) { described_class.new(config) } 
    context 'when initialized with a set of configs' do 
     it { expect(loader.instance_variable_get(:@configs)).to eq(configs)} 
    end 
    end 

當我把一個putsnil?檢查之前,令牌打印出什麼,但在我的耙子任務打電話initialize方法,它打印罰款。

回答

1

你的例子是有點混亂,由於你的努力來概括您的問題的各種拼寫錯誤。我創建了以下兩個文件,並且規格運行得很好。可能是您遇到的命名錯誤,而不是實際的rspec問題。

# test_spec.rb 

require 'rspec' 
require_relative 'my_class' 

describe MyClass do 
    describe '#initialize' do 
    let(:configs) { {some_token: '123-FakeToken'} } 
    let(:loader) { described_class.new(configs) } 
    context 'when initialized with a set of configs' do 
     it { expect(loader.instance_variable_get(:@configs)).to eq(configs)} 
    end 
    end 
end 

# my_class.rb 
class MyClass 
    #@configs = {} 

    def initialize(configs) 
    @configs = configs 
    check_configs 
    end 

    private 

    def check_configs 
    if @configs[:some_token].nil? 
     puts "log message" 
     raise 'an error' 
    end 
    end 
end 

也就是說,更大的問題是什麼是你想用你的測試來完成?

測試私有變量是一種氣味。理想情況下,在配置變量的情況下,它們將在設置時在您的實例中產生效果。例如,MyClass.foo的行爲將根據是否設置some_token而有所不同。測試foo的行爲是否隨some_token更改而變化是您想要的高價值測試。而不是正確地寫下@configs = configs的低價值測試。

1

因爲您在私有空間中創建了check_configs方法,所以您無法從初始化方法訪問它,因爲您正在初始化的對象正在尋找一個基本上對該類隱藏的方法。您可能需要公開方法或將您的初始化方法重新設置爲不包含私有方法。

  • 請注意,我回來後發現並不清楚。

初始化方法總是公開的,因此它們不能在方法中包含任何私有範圍。你可以在類中其他地方調用一個私有方法,除了初始化方法

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Private