gpt4 book ai didi

ruby - Rspec ruby 模拟

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:19 25 4
gpt4 key购买 nike

我想在一个模块上实现 100% 的覆盖率。我的问题是在一个方法中有一个变量(称为数据),我试图将数据注入(inject)其中以测试我的异常处理。这可以通过 mock 来完成吗?如果不是,我如何才能全面测试我的异常处理?

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 中我得到“预计会引发异常但没有引发任何异常”。我想也许我们也必须从您的 stub 中调用 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

最佳答案

提取将数据返回到单独方法的代码。然后,当您测试 open 时,您可以将该方法 stub 以返回各种字符串,这些字符串将执行 case 语句的不同分支。大致像这样的设置:

def self.get_data(path)
`.\\csv2text.exe #{path} -f xml --xml_output_styles 2>&1`
end

def self.open(path)
data = get_data(path)
...

我假设你知道如何stub methods in rspec ,但总体思路是这样的:

foo = ...
foo.stub(:get_data).and_return("Error: Wrong input filename or path:")
expect { foo.get_data() }.to raise_error MalformedCSVError

另请参阅 testing for exceptions 上的 Rspec 文档.

关于ruby - Rspec ruby 模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com