如何对以下内容进行单元测试:
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 :(得分: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
答案 1 :(得分: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能够改善。