我最近一直在使用Mechanize gem,并希望合并一些测试以确保我捕获正确的错误。测试错误处理的正确方法是什么?
这是我的基本方法:
def get(str)
url = format_url(str)
#puts "sending GET request to: #{url}"
sleep(0.1)
@page = Mechanize.new do |a|
a.user_agent_alias = 'Mac Safari'
a.open_timeout = 7
a.read_timeout = 7
a.idle_timeout = 7
a.redirect_ok = true
end.get(url)
rescue Mechanize::ResponseCodeError => e
puts "#{'Response Error:'.red} #{e}"
rescue SocketError => e
puts "#{'Socket Error:'.red} #{e}"
rescue Net::OpenTimeout => e
puts "#{'Connection Timeout:'.red} #{e}"
rescue Errno::ETIMEDOUT => e
puts "#{'Connection Timeout:'.red} #{e}"
rescue Net::HTTP::Persistent::Error
puts "#{'Connection Timeout:'.red} read timeout, too many resets."
end
这是测试处理错误的开始:
class TestErrorHandling < Mechanize::TestCase
context 'Example when sending a GET request' do
should 'rescue error and return nil' do
assert_equal nil, Example.get('http://localhost/pagethatdoesntexist')
end
end
end
我是朝着正确的方向前进吗?欢迎任何见解和/或资源。
答案 0 :(得分:2)
这是我找到更符合我要求的答案的链接: https://stackoverflow.com/a/17825110/5381605
describe 'testing' do
it 'must raise' do
a = Proc.new {oo.non_existant}
begin
a[]
rescue => e
end
e.must_be_kind_of Exception
end
end
答案 1 :(得分:1)
您需要mock
Mechanize
课程。搜索其他问题怎么做
答案 2 :(得分:1)
排序。您不应该在应用程序中再次测试依赖库 。它足以捕获Net :: HTTP :: Persistent :: Error而不确保底层功能正常工作。写得好的宝石应该提供自己的测试,你应该能够通过测试那个gem(例如,Mechanize)来根据需要访问这些测试。
你可以嘲笑这些错误,但你应该明智。以下是模拟SMTP连接的一些代码
class Mock
require 'net/smtp'
def initialize( options )
@options = options
@username = options[:username]
@password = options[:password]
options[:port] ? @port = options[:port] : @port = 25
@helo_domain = options[:helo_domain]
@from_addr = options[:from_address]
@from_domain = options[:from_domain]
#Mock object for SMTP connections
mock_config = {}
mock_config[:address] = options[:server]
mock_config[:port] = @port
@connection = RSpec::instance_double(Net::SMTP, mock_config)
allow(@connection).to receive(:start).and_yield(@connection)
allow(@connection).to receive(:send_message).and_return(true)
allow(@connection).to receive(:started?).and_return(true)
allow(@connection).to receive(:finish).and_return(true)
end
#more stuff here
end
我没有看到你测试任何在这里更有意义的自定义错误。例如,您可以在参数中测试url-unfriendly字符并从中进行救援。在这种情况下,您的测试将提供明确的内容。
expect(get("???.net")).to raise_error(CustomError)