Я пытаюсь написать собственный парсер для результатов моих огурцов. При этом я хочу написать вокруг него тесты rspec. В настоящее время у меня есть следующее:

describe 'determine_test_results' do
  it 'returns a scenario name as the key of the scenario results, with the scenario_line attached' do
    pcr = ParseCucumberJsonReport.new
    expected_results = {"I can login successfully"=>{"status"=>"passed", "scenario_line"=>4}}
    cucumber_results = JSON.parse(IO.read('example_json_reports/json_passing.json'))
    pcr.determine_test_results(cucumber_results[0]).should == expected_results
  end
end

Проблема в том, что determine_test_results имеет подметод под названием determine_step_results, что означает, что это действительно интеграционный тест между двумя методами, а не модульный тест для determine_test_results.

Как мне высмеять "ответ" из define_step_results?

Предположим, что define_step_results возвращает {"status" => "пройдено", "scene_line" => 4}

Что я пробовал:

pcr.stub(:determine_step_results).and_return({"status"=>"passed", "scenario_line"=>6})

А также

allow(pcr).to receive(:determine_step_results).and_return({"status"=>"passed", "scenario_line"=>6})
0
Matt Westlake 7 Май 2014 в 22:54

2 ответа

Лучший ответ

Вы можете использовать заглушки для того, что вы пытаетесь выполнить. Проект: RSpec Mocks 2.3 будет хорошее чтение относительно этого конкретного случая. Я добавил код ниже в качестве предложения.

describe 'determine_test_results' do
 it 'returns a scenario name as the key of the scenario results, with the scenario_line       attached' do
   pcr = ParseCucumberJsonReport.new
   expected_results = {"I can login successfully"=>{"status"=>"passed", "scenario_line"=>4}}

   # calls on pcr will return expected results every time determine_step_results is called in any method on your pcr object.
   pcr.stub!(:determine_step_results).and_return(expected_results)

   cucumber_results = JSON.parse(IO.read('example_json_reports/json_passing.json'))
   pcr.determine_test_results(cucumber_results[0]).should == expected_results
 end
end
1
Chris 7 Май 2014 в 19:06

Если все, что делает determine_test_results, - это вызов determine_step_results, вам не следует его тестировать, поскольку это тривиально ...

Если вы все же решите протестировать его, все, что вам нужно проверить, это то, что он вызывает функцию делегата и возвращает все, что ей передано:

describe ParseCucumberJsonReport do
  describe '#determine_test_results' do
    it 'calls determine_step_results' do
      result = double(:result)
      input = double(:input)
      expect(subject).to receive(:determine_step_results).with(input).and_return(result)

      subject.determine_test_results(input).should == result
    end
  end
end

Если он делает что-то еще (например, добавляет результат к большему хешу), вы также можете его описать:

describe ParseCucumberJsonReport do
  describe '#determine_test_results' do
    it 'calls determine_step_results' do
      result = double(:result)
      input = double(:input)
      expect(subject).to receive(:determine_step_results).with(input).and_return(result)
      expect(subject.larger_hash).to receive(:merge).with(result)

      subject.determine_test_results(input).should == result
    end
  end
end
0
Uri Agassi 7 Май 2014 в 19:44