代码之家  ›  专栏  ›  技术社区  ›  Dan Alvizu

编写rspec测试以在端口3000上命中另一个rails应用程序

  •  0
  • Dan Alvizu  · 技术社区  · 7 年前

    在我的rails应用程序中,我有一些使用stalker和beanstalkd的后端作业。这些工作的一部分是对应用程序的web接口进行api调用。我想为这个作业编写一个端到端的rspec测试,测试中的作业对rails应用程序进行一个实际的api调用。

    问题是-我总是被拒绝连接到默认的rails web端口, 3000 :

    Errno::ECONNREFUSED: Failed to open TCP connection to localhost:3000 (Connection refused - connect(2) for "localhost" port 3000)
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/webmock-1.24.2/lib/webmock/http_lib_adapters/net_http.rb:136:in `start_with_connect_without_finish'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/webmock-1.24.2/lib/webmock/http_lib_adapters/net_http.rb:104:in `request'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/rest-client-1.6.9/lib/restclient/net_http_ext.rb:51:in `request'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/rest-client-1.6.9/lib/restclient/request.rb:210:in `block in transmit'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/webmock-1.24.2/lib/webmock/http_lib_adapters/net_http.rb:123:in `start_without_connect'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/webmock-1.24.2/lib/webmock/http_lib_adapters/net_http.rb:150:in `start'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/rest-client-1.6.9/lib/restclient/request.rb:206:in `transmit'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/rest-client-1.6.9/lib/restclient/request.rb:68:in `execute'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/rest-client-1.6.9/lib/restclient/request.rb:35:in `execute'
    /Users/dalvizu/.rvm/gems/ruby-2.3.3/gems/rest-client-1.6.9/lib/restclient/resource.rb:76:in `put'
    

    我正在使用rspec运行我的测试-到目前为止,我试图声明我的测试是 :feature :request --它们是否启动实际的应用服务器并到达端口3000?在我的测试中有没有办法做到这一点?我用错端口了吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Greg    7 年前

    你没有透露太多细节,所以我会试着给出一个高水平的答案。也许会有帮助。

    :request 规格类型不会为您启动服务器(用于测试完整堆栈,包括路由,但不包括实际HTTP请求)

    :feature 要求的 capybara ,然后发出请求,例如,使用 visit 方法。capybara将启动一个服务器,并通过无头chrome或其他客户端执行http请求。但是你的 Job 可能不知道应该用 另一台服务器

    如果你用水豚,你可以得到当前的端口,这个问题已经解释过了 Cucumber / Capybara -- how to get the host and port of the current execution (如果有帮助的话,别忘了投上一票) 想办法把这些信息传递给你想测试的工作。

    一般来说,当你有一个异步组件时,端到端测试是很难的。您应该等待后台作业的结果显示多长时间,何时声明它? failed 是吗?

    而且,奇怪的是,你的工作必须点击http服务器…它应该更容易访问应用程序对象本身,不是吗?

    除非是另一个应用服务器。然后,您只需要确保它正在运行(作为依赖项),就像在运行规范之前确保DB服务器正在运行一样。