我正在编写一个 gem,其中包含开发人员可以扩展的 Sinatra 应用程序。例如:
# gem code:
require 'sinatra'
module Mygem
class Application < Sinatra::Base
get 'auth/login' {}
get 'auth/logout {}
end
end
# developer code:
require 'mygem'
class DeveloperApp < Mygem::Application
# ..
end
我也开始使用RSpec。我应该如何配置 RSpec 以测试此功能?
上面的参考资料都是信息丰富且有用的,但主要是特定于轨道的。 我发现很难找到一个简单的方法来对模块化Sinatra应用程序进行基本测试,所以我希望这能为其他人回答这个问题。 这是一个完全裸露的,尽可能小的测试。 这可能不是唯一的方法,但它适用于模块化应用程序:
require 'sinatra'
class Foo < Sinatra::Base
get '/' do
"Hello"
end
end
require 'rack/test'
describe Foo do
include Rack::Test::Methods
def app
Foo.new
end
it "should be testable" do
get '/'
last_response.should be_ok
end
end
请注意,启动测试时不需要运行服务器(我看到的一些教程暗示您这样做) - 这不是集成测试。
这实际上非常简单 - 只需将 rspec 添加到您的 gemfile 中(然后捆绑安装),并在您的 gem 中创建一个名为 spec/的目录。 完成此操作后,添加一个文件规范/spec_helper.rb,其中包含一些 rspec 配置(通常需要库中的各种文件),以及为您的规范定义一些帮助程序方法。 然后,为每个模型和控制器创建一个名为 my_model_name_spec.rb 或 my_controller_name_spec.rb 的文件,并在那里进行测试。
以下是一些开始使用 rspec 的有用资源:
轨道广播:
http://railscasts.com/episodes/275-how-i-test
http://railscasts.com/episodes/71-testing-controllers-with-rspec
http://railscasts.com/episodes/157-rspec-matchers-macros/
对于一些更高级(但解释清楚)的东西:
http://benscheirman.com/2011/05/dry-up-your-rspec-files-with-subject-let-blocks
一定要包括机架测试宝石。
您的规范助手应具有:
require 'rack/test'
require 'foo' # or where ever your app is
# This can go in a helper somewhere
module AppHelper
def app
Foo.new
end
end
RSpec.configure do |config|
config.include Rack::Test::Methods
config.include AppHelper
end
然后,您的规格可以如下所示:
require 'spec_helper'
# Example app. Delete this example.
class Foo < Sinatra::Base
get '/' do
'Jesse Pinkman'
end
end
describe Foo do
it 'is testable' do
get '/' do
expect(last_response).to be_ok
end
end
end