下面是我的机架应用程序:
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使用它。以下是我的测试:
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发出请求,因为那里的服务器已经启动了?
发布于 2016-08-20 06:27:20
第一件事:为什么要使用自定义类来运行应用程序?您可以使用rackup工具,它是运行机架应用程序的事实标准。关于它的更多细节,here。
然后你的应用程序代码就变成了:
class App
def call(env)
return [200, {}, ['Hello, World!']]
end
end并使用config.ru
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方法。
我希望现在已经清楚了为什么测试应该看起来像这样(是的,在执行测试时不需要运行服务器):
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
发布于 2016-08-18 21:59:00
你的应用应该是类名,例如,而不是:
def app
MainAppLogic.new
end你必须使用
def app
MainAppLogic
end您不需要指定执行get的端口,因为rack应用程序在测试的上下文中运行;因此这应该是正确的方式:
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,应该是这样的:
class MainAppLogic < Sinatra::Base
get '/' do
'Hello world'
end
endhttps://stackoverflow.com/questions/39017784
复制相似问题