0

如何对以下内容进行单元测试:

  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'

4

2 回答 2

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
于 2013-10-06T01:32:01.720 回答
0

你想调用yield

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

查看此答案以了解相关问题的不同方法。希望rr api 文档会有所改进。

于 2013-10-05T18:41:44.523 回答