Я пробую весь подход 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 #<#
.
Код, который я тестирую, а именно метод 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)
Заранее спасибо!