2012-07-14 32 views
1

我只是在测试带有RSpec的Goliath API时遇到了奇怪的行为。我的一个测试是这样的:当在一个RSpec套件中调用多个with_api()测试时,Goliath会中断em-synchrony/em-hiredis

require 'helper' 

describe Scales::Dispatch do 

    it "should return a 404 if resource was not found" do 
    with_api(Scales::Server) do 
     get_request(:path => '/') do |client| 
     client.response_header.http_status.should == 404 
     end 
    end 
    end 

    it "should return a resource" do 
    Scales::Storage::Sync.set "/existing", "some content" 

    with_api(Scales::Server) do 
     get_request(:path => '/existing') do |client| 
     client.response_header.http_status.should == 200 
     client.response.should == "some content" 
     end 
    end 

    Scales::Storage::Sync.del "/existing" 
    end 

end 

的API基本上只查找在Redis的一个关键与em-synchrony/em-hiredis帮助这样的:

module Scales 
    module Lookup 
    class << self 

     def request(env) 
     response = Storage::Async.get(path(env)) 
     response.nil? ? render_not_found : render(response) 
     end 

     private 

     def path(env) 
     env["REQUEST_URI"] 
     end 

     def render_not_found 
     [404, {}, ""] 
     end 

     def render(response) 
     [200, {}, response] 
     end 

    end 
    end 
end 

这两项测试分别运行,却不能在一起。第一次执行后,整个系统停止约10秒钟。然后调用第二个with_api,但get_request从不执行 - 我认为它正在某种超时运行。

我在另一个发现同样的行为,非常类似的测试,是推动和弹出队列是这样的:

describe Scales::Queue::Async do 

    [Scales::Queue::Async::Request, Scales::Queue::Async::Response].each do |queue| 
    context queue.name.split("::").last do 

     it "should place a few jobs" do 
     async do 
      queue.add "job 1" 
      queue.add "job 2" 
      queue.add "job 3" 
     end 
     end 

     it "should take them out blocking" do 
     async do 
      queue.pop.should == "job 1" 
      queue.pop.should == "job 2" 
      queue.pop.should == "job 3" 
     end 
     end 

    end 
    end 

end 

也根本没有执行的第二async do ..内容。如果没有巨人加载一个相当类似的测试运行非常好:

require 'eventmachine' 
require 'em-synchrony' 
require 'em-synchrony/em-hiredis' 

module Helpers 

    def async 
    if EM.reactor_running? 
     yield 
    else 
     out = nil 
     EM.synchrony do 
     out = yield 
     EM.stop 
     end 
     out 
    end 
    end 

end 

RSpec.configure do |config| 
    config.include Helpers 
    config.treat_symbols_as_metadata_keys_with_true_values = true 
end 

describe "em-synchrony/em-hiredis" do 

    it "should lpush a job" do 
    async do 
     redis = EM::Hiredis.connect 
     redis.lpush("a_queue", "job1") 
    end 
    end 

    it "should block pop a job" do 
    async do 
     redis = EM::Hiredis.connect 
     redis.brpop("a_queue", 0).last.should == "job1" 
    end 
    end 

end 

async do ..前一个任务是相同的RSpec帮手。

我整天都在疯狂寻找,但对我来说却没有任何意义。因为最后一次测试运行的很好,我猜想它既不是em-synchrony也不是em-synchrony/em-hiredis的东西。

也许巨人没有停下来,占据新兴市场太久了?

感谢您的帮助,这让我疯狂!

回答

0

好的,我找到了解决方案。

我在每次请求之前都检查连接,如果在那里,我没有重新建立连接。但是,当事件机器的每一次停止都关闭连接时,看起来基本上对于每一个新的请求都有一个连接超时失败了。

谢谢你的时间!

相关问题