我想在一个模块上实现 100% 的覆盖率。我的问题是在我试图注入数据以测试我的异常处理的方法中有一个变量(称为数据)。这可以通过嘲笑来完成吗?如果不是,我该如何全面测试我的异常处理?
module CSV
module Extractor
class ConversionError < RuntimeError; end
class MalformedCSVError < RuntimeError; end
class GenericParseError < RuntimeError; end
class DemoModeError < RuntimeError; end
def self.open(path)
data = `.\\csv2text.exe #{path} -f xml --xml_output_styles 2>&1`
case data
when /Error: Wrong input filename or path:/
raise MalformedCSVError, "the CSV path with filename '#{path}' is malformed"
when /Error: A valid password is required to open/
raise ConversionError, "Wrong password: '#{path}'"
when /CSVTron CSV2Text: This page is skipped when running in the demo mode./
raise DemoModeError, "CSV2TEXT.exe in demo mode"
when /Error:/
raise GenericParseError, "Generic Error Catch while reading input file"
else
begin
csvObj = CSV::Extractor::Document.new(data)
rescue
csvObj = nil
end
return csvObj
end
end
end
end
让我知道你的想法!谢谢
===================== 编辑========================
我已将我的方法修改为您建议的设计模式。这个方法-"open(path)" 负责捕获和引发错误,get_data(path) 只是返回数据,就是这样!但不幸的是,在 rspec 中,我得到“预计会引发异常,但没有引发任何异常”。我想也许我们也必须从你的存根中调用 open 方法?
这是我尝试做的,但仍然没有引发错误..
it 'should catch wrong path mode' do
obj = double(CSV::Extractor)
obj.stub!(:get_data).and_return("Error: Wrong input filename or path:")
obj.stub!(:open)
expect {obj.open("some fake path")}.to raise_error CSV::Extractor::MalformedCSVError
end