预期异常,但没有使用Rspec引发任何内容

时间:2014-08-21 19:22:37

标签: ruby rspec

我正在尝试通过最后一次测试:尝试提出异常我无法使其正常工作 我的错误记录:

1)如果没有任何RIGHT匹配,VideoSearch会发现整个采样器集合都会失败      失败/错误:期望(vs.find_all_by_title(2343))。到raise_error        预期的例外,但没有提出任何内容

我的代码:

class VideoSearch

  attr_accessor :title, :samplers

  def initialize(params)
    @title = params
    @samplers = []    
  end

  def find_all_by_title(title)
    return [] if title.blank?
    Video.where(title: title).first
  end

  def find_the_whole_collection(title)  
    if find_all_by_title(title)
      sampler = find_all_by_title(title)
      @samplers = [sampler] #add the video as the first sample
    else
      raise Exception
      return false # it's false if there 's not any match!
    end
  end
end

我的规格:

describe 'find then whole collection of samplers ' do
  let(:v1) { v1 = Video.create( title: 2345 ) }
  let(:vs) { VideoSearch.new v1.title }
  let(:sample) { vs.find_all_by_title(v1.title) }

  context 'failing' do
    before :each do
      vs.stub(:find_all_by_title).and_return(nil)
    end

    it ' complains if there is not any RIGHT match ' do
      expect(vs.find_all_by_title(2343)).to raise_error
    end
  end     
end

1 个答案:

答案 0 :(得分:1)

你的前一个块正在删除:find_all_by_title并返回nil,所以它不会引发错误。存根基本上意味着'如果调用此方法,而是执行此操作',因此在存根时不会运行所有代码。要使代码生效,请删除before_block。此外,在测试未发现的项目时,惯例是传递id -1,因此您的测试可能如下所示:

context 'failing' do
  it 'complains if there is not any RIGHT match' do
    expect( vs.find_all_by_title(-1) ).to raise_error
  end
end

此外,你不应该提出Exception,你应该至少提出StandardError(或者,真的,StandardError的一个子类,它更能描述你的内容或许,制作一个名为StandardError的{​​{1}}的子类?)。

此外,您的TitleNotFoundError方法中还有冗余代码:

find_whole_collection

可缩短为:

if find_all_by_title(title)
  sampler = find_all_by_title(title)

如果在if sampler = find_all_by_title(title) 语句中为变量指定一个nil值,它将返回false,因此您只需要调用if一次。

最后,如果空白,则find_all_by_title方法返回空数组find_all_by_title,但如果找不到则[] - 这可能会产生问题(例如,您的nil实例如果没有传递标题,变量将包含@samples