首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >配置机架测试以间接启动服务器

配置机架测试以间接启动服务器
EN

Stack Overflow用户
提问于 2016-08-18 20:04:35
回答 2查看 261关注 0票数 0

下面是我的机架应用程序:

代码语言:javascript
运行
复制
class MainAppLogic
    def initialize
        Rack::Server.start(:app =>Server, :server => "WEBrick", :Port => "8080")
    end
end

class Server
    def self.call(env)
        return [200, {},["Hello, World"]]
    end
end

当实际运行时,它的行为是正常的,并向所有请求返回"Hello World“。我很难说服rack-test使用它。以下是我的测试:

代码语言:javascript
运行
复制
require "rspec"
require "rack/test"
require "app"

# Rspec config source: https://github.com/shiroyasha/sinatra_rspec    
RSpec.configure do |config|
    config.include Rack::Test::Methods
end

describe MainAppLogic do

    # App method source: https://github.com/shiroyasha/sinatra_rspec
    def app
        MainAppLogic.new
    end

    it "starts a server when initialized" do
        get "/", {}, "SERVER_PORT" => "8080"
        last_response.body.should be != nil
    end
end

当我测试它时,它失败了,它报告说MainAppLogic不是一个机架服务器,特别是它不响应MainAppLogic.call。我如何才能让它知道忽略MainAppLogic不是机架服务器,而只是向localhost:8080发出请求,因为那里的服务器已经启动了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-20 06:27:20

第一件事:为什么要使用自定义类来运行应用程序?您可以使用rackup工具,它是运行机架应用程序的事实标准。关于它的更多细节,here

然后你的应用程序代码就变成了:

代码语言:javascript
运行
复制
class App
  def call(env)
    return [200, {}, ['Hello, World!']]
  end
end

并使用config.ru

代码语言:javascript
运行
复制
require_relative 'app'

run App.new

您可以通过运行项目目录中的rackup来启动该应用程序。

至于错误,信息很清楚。rack-test期望app方法的返回值是rack应用程序的实例(响应call方法的对象)。看看rack-test内部发生了什么(作为提示,很容易理解-按照给定的顺序关注它们:lib/rack/test/methods.rb#L30 lib/rack/mock_session.rb#L7 lib/rack/test.rb#L244 lib/rack/mock_session.rb#L30。注意Rack::MockSession是如何实例化的,如何在处理请求时使用它(例如,当您在测试中调用get方法时),最后是如何在您的应用程序上执行call方法。

我希望现在已经清楚了为什么测试应该看起来像这样(是的,在执行测试时不需要运行服务器):

代码语言:javascript
运行
复制
describe App do
  def app
    App.new
  end

  it "does a triple backflip" do
    get "/"
    expect(last_response.body).to eq("Hello, World")
  end
end

附注:很抱歉链接到rack-test的形式,我当前的分数不能超过2 :P

票数 1
EN

Stack Overflow用户

发布于 2016-08-18 21:59:00

你的应用应该是类名,例如,而不是:

代码语言:javascript
运行
复制
def app
  MainAppLogic.new
end

你必须使用

代码语言:javascript
运行
复制
def app
  MainAppLogic
end

您不需要指定执行get的端口,因为rack应用程序在测试的上下文中运行;因此这应该是正确的方式:

代码语言:javascript
运行
复制
it "starts a server when initialized" do
    get "/"
    last_response.body.should be != nil
end

此外,由于建议使用新的expect格式而不是should,请参见http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/

和你的MainAppLogic,应该是这样的:

代码语言:javascript
运行
复制
class MainAppLogic < Sinatra::Base
  get '/' do
    'Hello world'
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39017784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档