- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试整个 BDD
方法并想测试 AMQP
基于 Vanilla 的方面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
我已经注释掉了 the em-minitest-spec gem 的内容应该强制规范在 EventMachine
中运行的功能reactor,如果我包含它,我会遇到一个关于(我想)内联类等更粗略的异常:NoMethodError: undefined method 'include' for #<#<Class:0x3a1d480>:0x3b29e00>
.
我正在测试的代码,即 connect
该服务中的方法基于 on this article看起来像这样:
# 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
不能很好地适应整个 react 堆概念,并且未能通过此 Exception
的地面测试.
然后问题仍然存在:如何测试 EventMachine
-相关代码使用Minitest
的规范机制? Another question也一直在徘徊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)
提前致谢!
最佳答案
很抱歉,如果此回复过于迂腐,但我认为如果您区分单元测试和验收测试,您将更容易编写测试和库。
注意不要将 BDD 与 TDD 混淆。虽然两者都非常有用,但当您尝试在验收测试中测试每个边缘情况时,它可能会导致问题。例如,BDD 是关于测试您试图通过您的服务完成什么,这更多地与您对消息队列所做的事情有关,而不是连接到队列本身。在我看来,当您尝试连接到一个不存在的消息队列时会发生什么更适合单元测试的领域。还值得指出的是,您的服务不应该负责测试消息队列本身,因为这是 AMQP 的职责。
虽然我不确定您的服务应该做什么,但我想您的 BDD 测试应该类似于:
换句话说,BDD(或验收测试或集成测试,无论您如何看待它们)可以将您的应用视为一个应该提供特定功能(或行为)的黑盒子。这些测试让您专注于您的最终目标,但更多的是为了确保一两个黄金用例,而不是应用程序的健壮性。为此,您需要分解为单元测试。
当您进行 TDD 时,让测试在代码组织方面为您提供一些指导。很难测试创建新线程并在该线程内运行 EM 的方法,但单独对其中任何一个进行单元测试并不难。因此,考虑将主线程代码放入一个单独的函数中,您可以单独对其进行单元测试。然后,您可以在对 connect
方法进行单元测试时删除该方法。此外,您可以测试当 AMQP 抛出错误时发生的情况(这是您的代码要处理的错误),而不是测试当您尝试连接到错误的服务器时会发生什么(这会测试 AMQP)。在这里,您的单元测试可以将 AMQP.connect
的响应 stub 以抛出异常。
关于ruby - 规范测试基于 EventMachine 的(Reactor)代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11374425/
我的控制台上出现以下错误 root@comp09:~# gem install eventmachine Building native extensions. This could take a
我在 JRuby 中安装了 EventMachine(我使用的是 Win32)。当我尝试服务器示例时,出现错误 require 'eventmachine' 错误是: C:\dev\em>jruby
我有一些 Deferrables,当它们全部完成时我需要在回调中做一些事情。 defers[0].callback do defers[1].callback do defer
我正在编写一个应用程序,它使用 EventMachine 来中继来自服务的命令。我想重新使用与服务的连接(而不是为每个新请求重新创建它)。该服务从模块方法启动,并且该模块提供给 EventMachin
更新: 我找到了简单的答案,这完全是我自己的错:我将上面的代码存储在一个名为“eventmachine.rb”的文件中。因此,当我需要“eventmachine”时,它只是导入了相同的文件,其中不包含
好的,我有代码在后台使用 Cramp\Tramp => EventMachine。代码: class RetrieveController 0.12' gem 'tramp', '~> 0.2' g
每个人总是明确提到 next_tick 将在主线程中执行。但是定时器和回调/错误反馈呢?它们是否也保证在主线程中运行? 最佳答案 无论 Ruby 版本如何,EM 在 react 器线程内运行除 EM.
在 ruby 1.9.2-p290 上编译 eventmachine 0.12.10 时出现以下错误输出: g++ -shared -o rubyeventmachine.so binder.o cm
我收到以下错误: eventmachine.rb:534:in `start_tcp_server': no acceptor (port is in use or requires root pri
我有一个使用 eventmachine 编写的小型 HTTP 服务器脚本,它需要调用外部脚本/命令并通过反引号 (``) 调用。当提供不运行反引号代码的请求时,一切都很好,但是,一旦我的 EM 代码执
我写了一个像这样的简单的 EventMachine 服务器: EventMachine.run do EventMachine::WebSocket.start(:host => HOST, :p
“run” block 是否在 EM 中作为一个整体执行(没有上下文切换)?在此示例中,if 子句中是否存在竞争条件? EventMachine.run { @current_value = 0
获取端口已在使用错误。 require 'em-websocket' EM.run { EM::WebSocket.run(:host => "192.168.1.100", :port =>
我对一般编程还很陌生,我在客户端和服务器端都使用 EventMachine 来打开它们之间的 websocket 连接。 我的问题出在客户端,以及由于网络连接问题导致连接丢失时。 def websoc
如何终止 EventMachine 中正在运行的进程?下面是一个示例,我正在启动 10 个进程,然后我试图将它们全部删除(但它不起作用)。我的目标是不要有“完成”输出。 require "rubyge
我使用 EventMachine LineText2 协议(protocol),我想在每次按下键盘上的字符时触发 receive_line 方法,而不仅仅是在输入新行时触发。有没有办法改变这种默认行为
这是我的代码: EventMachine.run { conn = EM::Protocols::HttpClient2.connect request.host, 80 req =
我正在研究使用 EventMachine 支持的 twitter-stream rubygem 来跟踪和捕获推文。我对整个事件编程有点陌生。我如何判断我在事件循环中所做的任何处理是否导致我落后?有
我的第一个问题是关于 Ruby 的。我正在尝试测试 Reactor 循环内的 EventMachine 交互 - 我想它可以归类为“功能”测试。 假设我有两个类 - 服务器和客户端。我想测试双方 -
我正在使用合适的 Redis EM gem(在我的例子中为“em-hiredis”)读取 EventMachine react 器循环中的 Redis 集,并且必须检查某些 Redis 集是否包含级联
我是一名优秀的程序员,十分优秀!