我正在尝试通过最后一次测试:尝试提出异常我无法使其正常工作 我的错误记录:
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
答案 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
。