这是我对Sinatra的第一次尝试。我构建了一个简单的经典应用程序,为它设置RSpec,并让它工作。然后,我尝试以MVC方式进行模块化。即使应用程序在浏览器中工作,RSpec也会抛出NoMethodError
。我已经阅读过关于RSpec的Sinatra文档,在SO中也搜索了很多,但我找不到bug的位置。任何线索?
非常感谢你。
以下是我的相关文件:
config.ru
require 'sinatra/base'
Dir.glob('./{app/controllers}/*.rb') { |file| require file }
map('/') { run ApplicationController }
app.rb
require 'sinatra/base'
class ZerifApp < Sinatra::Base
# Only start the server if this file has been
# executed directly
run! if __FILE__ == $0
end
应用/控制器/ application_controller.rb
class ApplicationController < Sinatra::Base
set :views, File.expand_path('../../views', __FILE__)
set :public_dir, File.expand_path('../../../public', __FILE__)
get '/' do
erb :index
end
end
规格/ spec_helper.rb
require 'rack/test'
# Also tried this
# Rack::Builder.parse_file(File.expand_path('../../config.ru', __FILE__))
require File.expand_path '../../app.rb', __FILE__
ENV['RACK_ENV'] = 'test'
module RSpecMixin
include Rack::Test::Methods
def app() described_class end
end
RSpec.configure { |c| c.include RSpecMixin }
规格/ app_spec.rb
require File.expand_path '../spec_helper.rb', __FILE__
describe "My Sinatra Application" do
it "should allow accessing the home page" do
get '/'
expect(last_response).to be_ok
end
end
错误
My Sinatra Application should allow accessing the home page
Failure/Error: get '/'
NoMethodError:
undefined method `call' for nil:NilClass
# ./spec/app_spec.rb:5:in `block (2 levels) in <top (required)>'
答案 0 :(得分:5)
我猜你是否关注this recipe,对吗?
此行中的described_class
:
def app() described_class end
意味着是被测试的类,在本例中为ZerifApp
。试试吧:
def app() ZerifApp end
修改强>
事实证明上述答案对described_class
的作用不正确。我假设它是一个占位符 - 实际上它是一个RSpec方法,它返回隐式主题的类,也就是说,正在测试的东西。
链接上的配方会产生误导,因为它建议编写describe
块:
describe "My Sinatra Application" do
这是有效的RSpec,但它没有定义主题类。在此块的示例中执行described_class
将返回nil
。要使其工作,请替换describe块:
describe ZerifApp do
现在described_class
将返回预期值(ZerifApp
)
答案 1 :(得分:0)
https://pragprog.com/book/7web/seven-web-frameworks-in-seven-weeks
它有一些源代码可以从中获取一些想法。