在Sinatra模块化应用程序中设置RSpec

时间:2014-08-05 07:27:29

标签: ruby rspec sinatra

这是我对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)>'

2 个答案:

答案 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

它有一些源代码可以从中获取一些想法。

这也有代码示例。 https://github.com/laser/sinatra-best-practices