2015-10-14 5 views
2

Я недавно работал с драгоценным камнем Mechanize и хотел бы включить некоторые тесты, чтобы убедиться, что я уловил правильные ошибки. Каков правильный способ проверки ошибок?Каков правильный способ проверки ошибок?

Это мой основной метод:

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 

Могу ли я отправиться в правильном направлении? Любые идеи и/или ресурсы приветствуются.

ответ

1

Сортировка. Вы не должны повторно тестировать зависимые библиотеки в своем приложении. Достаточно поймать Net :: HTTP :: Persistent :: Error, не гарантируя, что базовые функции работают. Хорошо написанные драгоценные камни должны давать свои собственные тесты, и вы должны иметь возможность получить доступ к этим тестам по мере необходимости, тестируя этот драгоценный камень (например, 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-адреса недружественных символов в своем параметре и избавиться от этого. В этом случае ваш тест будет предлагать что-то явное.

expect(get("???.net")).to raise_error(CustomError) 
+2

ха-ха, ответить отредактирован, прежде чем я ударил -1 – akostadinov

+0

@jjk спасибо за ваш ответ. Некоторое основание для этого - мой искатель получил все типы ошибок в прошлом, будь то попытка достичь страницы, которая не существует, или просто таймаут соединения. Механизация поднимает каждую из ошибок должным образом, я хочу проверить обработку. – binarymason

+1

, поэтому, если вам нужно быть явным, вы создадите макет-объект, полагающийся на каждый из этих базовых объектов. Тогда вы можете справиться с ними, чтобы подняться или что-то еще. Вы заметили, что я использую двойной экземпляр rspec для создания интерфейса, который я могу использовать. Тогда я могу ссылаться на это в экземпляре моего макета. Если это полезно, отметьте этот ответ как правильный. – jjk

1

необходимо mockMechanize класс. поиск другие вопросы как сделать

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 
+0

рад, что вы нашли свое решение – akostadinov

Смежные вопросы