【问题标题】:Prevent ArgumentError when using RSpec Doubles使用 RSpec Doubles 时防止 ArgumentError
【发布时间】:2017-01-03 01:59:29
【问题描述】:

我目前正在尝试使用以下代码引发错误:

class NasaController
  attr_reader :plateau, :current_rover

  def initialize(plateau:)
    @plateau = plateau
    @current_rover = []
  end

  def link_to_rover(robotic_rover)
    raise ArgumentError, "#{robotic_rover.class}" unless robotic_rover.is_a? RoboticRover
    @current_rover = robotic_rover
  end
end

它有效!伟大的!但是…………

我的测试是:

describe NasaController do
  subject(:controller) { described_class.new(plateau: plateau) }

  let(:robotic_rover) do
    double(:robotic_rover, #some_methods...)
  end

  let(:plateau) { double(:plateau, rover_landed: landed_rover) }

  describe 'interacting with a rover' do
    context 'when a RoboticRover is used' do
      before { controller.link_to_rover(robotic_rover) }

      it 'can create a link' do
        expect(controller.current_rover).to eq robotic_rover
      end

    context 'when something other than a RoboticRover is used' do
      it 'raises an error at #link_to_rover' do
        expect { controller.link_to_rover(plateau) }.to raise_error 'Error!'
      end
    end
  end
end

这导致我的第二次测试通过,因为 controller.link_to_rover(plateau) 没有链接 RoboticRover。

但是,我的第一次失败了,因为controller.link_to_rover(robotic_rover) 也不是 RoboticRover,它是 RoboticRover 的双倍。有人对解决此问题有任何指导吗?

【问题讨论】:

    标签: ruby rspec error-handling exception-handling mocking


    【解决方案1】:

    您需要允许robotic_rover 接收is_a?,参数为RoboticRover,并让它返回true。尝试将以下内容添加到失败的测试中:

    allow(robotic_rover).to receive(:is_a?).with(RoboticRover).and_return(true)
    

    或加倍:

    let(:robotic_rover) do
        double(:robotic_rover, is_a?: RoboticRover
    end
    

    更多信息请参见here

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多