ruby - وحدة اختبار روبي كتل بواسطة السخرية مع ر(كان فليكسموك)




unit-testing mocking (2)

كيف يمكنني اختبار الوحدة التالية:

  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

كيف يمكنني اختبار ما هو داخل الكتلة؟

محدث

لقد حولت بلدي اختبار للمواصفات وتحولت إلى ر إطار يسخر:

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' ؟


أولا، يمكنك كتابة هذا أبسط قليلا - الاختبار الخاص بك باستخدام ر ليست منفذ مباشر للاختبار باستخدام فليكسموك. ثانيا، أنت لا تختبر ما يحدث داخل الكتلة على الإطلاق، بحيث يكون الاختبار غير كامل. جرب ذلك بدلا من ذلك:

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

تريد استدعاء العائد :

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