你如何使用rspec模拟依赖方法

时间:2014-05-07 18:54:33

标签: ruby rspec mocking rspec2

我正在尝试为我的黄瓜结果编写自定义解析器。在这样做时,我想围绕它编写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的单元测试。

我如何模仿Determ_step_results的“回复”?

假设determine_step_results返回{“status”=>“已通过”,“scenario_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})

2 个答案:

答案 0 :(得分:1)

您可以利用存根来实现您想要完成的任务。对于这个特殊情况,Project: 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 :(得分:0)

如果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