Спецтестирование EventMachine -на основе (Reactor )Код

Я пробую весь подход BDDи хотел бы протестироватьAMQP-основанный на аспекте ванильного Rubyприложения, которое я пишу. Выбрав Minitestв качестве тестового фреймворка из-за его баланса функций и выразительности в отличие от других -метко названных растительных фреймворков, я решил написать эту спецификацию :

# File./test/specs/services/my_service_spec.rb

# Requirements for test running and configuration
require "minitest/autorun"
require "./test/specs/spec_helper"

# External requires
# Minitest Specs for EventMachine
require "em/minitest/spec"

# Internal requirements
require "./services/distribution/my_service"

# Spec start
describe "MyService", "A Gateway to an AMQP Server" do

  # Connectivity
  it "cannot connect to an unreachable AMQP Server" do

   # This line breaks execution, commented out
   # include EM::MiniTest::Spec

   #...
   # (abridged) Alter the configuration by specifying
   # an invalid host such as "l0c@alho$t" or such
   #...

   # Try to connect and expect to fail with an Exception
   MyApp::MyService.connect.must_raise EventMachine::ConnectionError
  end

end

. Я закомментировал включение функции em -minitest -spec gem , которая должна заставить спецификацию работать внутри EventMachineреактора. более схематичное исключение относительно (я полагаю )встроенных классов и тому подобного:NoMethodError: undefined method 'include' for #<#:0x3b29e00>.

Код, который я тестирую, а именно метод connectв этой службе, основан на этой статье и выглядит следующим образом:

# Main namespace
module MyApp

  # Gateway to an AMQP Server
  class MyService

    # External requires
    require "eventmachine"
    require "amqp"

    # Main entry method, connects to the AMQP Server
    def self.connect

      # Add debugging, spawn a thread
      Thread.abort_on_exception = true
      begin
        @em_thread = Thread.new {
          begin
            EM.run do
              @connection  = AMQP.connect(@settings["amqp-server"])
              AMQP.channel = AMQP::Channel.new(@connection)
            end
          rescue
            raise
          end
        }

        # Fire up the thread
        @em_thread.join

        rescue Exception
          raise
        end
      end # method connect
  end
end  # class MyService

Вся «обработка исключений » — это просто попытка передать исключение в место, где я могу его поймать/обработать, что тоже не помогло, с beginи raiseили без них. биты я все еще получаю тот же результат при запуске спецификации:

EventMachine::ConnectionError: unable to resolve server address, что на самом деле является тем, что я ожидал,тем не менее, Minitestне согласуется со всей концепцией реактора и не проходит испытание на основании этого Exception.

Тогда остается вопрос :Как проверитьEventMachine-связанный код с использованием механизмов спецификации Minitest? Еще один вопрос , касающийся Cucumber, также остался без ответа.

Или я должен сосредоточиться на своей основной функциональности (, например. обмен сообщениями и проверка отправки/получения сообщений )и забыть о крайних случаях? Любое понимание действительно поможет!

Конечно, все может сводиться к коду, который я написал выше, возможно, это не тот способ, которым пишут/тестируют эти аспекты. Может быть!

Заметки о моем окружении:ruby 1.9.3p194 (2012-04-20) [i386-mingw32](да, Win32 :> ), minitest 3.2.0, eventmachine (1.0.0.rc.4 x86-mingw32),amqp (0.9.7)

Заранее спасибо!

6
задан Community 23 May 2017 в 10:09
поделиться