私はアプローチ全体を試していますが、私が書いているバニラアプリケーション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
スペックをreactor内で実行するように強制するem-minitest-specgemの機能を含めることについてコメントしました。これを含めるEventMachine
と、インラインクラスなどに関してさらに大雑把な例外が発生しますNoMethodError: undefined method 'include' for #<#<Class:0x3a1d480>: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
を使用して、関連するコードをどのようにテストするのでしょうか。もう1つの質問も、未回答の問題について浮かんでいます。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)
前もって感謝します!