2013-04-07 26 views
0

我如何單元測試如下:單元測試Ruby塊與RR懲戒(是flexmock)

def update_config 
    store = YAML::Store.new('config.yaml') 
    store.transaction do 
     store['A'] = 'a' 
    end 
    end 

這裏是我的開始:

def test_yaml_store 
    mock_store = flexmock('store') 
    mock_store 
     .should_receive(:transaction) 
     .once 
    flexmock(YAML::Store).should_receive(:new).returns(mock_store) 
    update_config() 
    end 

如何測試裏面是什麼的塊?

修訂

我已經將我的測試規範,切換到讓rr嘲諷框架:

describe 'update_config' do 
    it 'calls transaction' do 
    stub(YAML::Store).new do |store| 
     mock(store).transaction 
    end 
    update_config 
    end 
end 

這將考驗該交易被調用。我如何測試塊內:store['A'] = 'a'

回答

0

要撥打產量

describe 'update_config' do 
    it 'calls transaction which stores A = a' do 
    stub(YAML::Store).new do |store| 
     mock(store).transaction.yields 
     mock(store).[]=('A', 'a') 
    end 
    update_config 
    end 
end 

退房this answer一種不同的方法,以一個相關的問題。希望rr api documentation會有所改善。

1

首先,你可以寫得更簡單 - 使用RR的測試不是使用FlexMock進行測試的直接端口。其次,你沒有測試塊內發生的情況,所以你的測試不完整。試試這個:

describe '#update_config' do 
    it 'makes a YAML::Store and stores A in it within a transaction' do 
    mock_store = {} 
    mock(mock_store).transaction.yields 
    mock(YAML::Store).new { mock_store } 
    update_config 
    expect(mock_store['A']).to eq 'a' 
    end 
end 

注意,因爲你提供#transaction的實施,不僅返回值,你可以有還表示,這種方式:

describe '#update_config' do 
    it 'makes a YAML::Store and stores A in it within a transaction' do 
    mock_store = {} 
    mock(mock_store).transaction { |&block| block.call } 
    mock(YAML::Store).new { mock_store } 
    update_config 
    expect(mock_store['A']).to eq 'a' 
    end 
end 
+0

謝謝。這個問題最初是如何測試Flexmock中的塊內部的。我改變了rr,因爲沒有人回答了幾個月。 – zhon 2013-10-07 20:26:24