2010-01-13 87 views
17

我不知道如何测试我的Sinatra应用程序。我只是运行你如何在Sinatra中运行测试?

ruby​​

这似乎并不奏效。在那里的所有文件只讨论如何编写文件的内容,而不讨论如何让它运行。

感谢

+0

正式Sinatra文档测试:http://www.sinatrarb.com/testing.html – imwilsonxu 2012-09-15 05:52:09

回答

-1

ruby your_app_name.rb一样简单。实际上,这显示在Sinatra homepage(底部)。

+1

感谢您的回复。我想我不清楚 - 我如何运行我创建的Rack :: Test测试文件。 – 2010-01-13 18:34:24

27

应该很简单。

鉴于my_app.rb:

require 'rubygems' 
require 'sinatra' 

get '/hi' do 
    "Hello World!" 
end 

而且my_app_test.rb:

require 'my_app' 
require 'test/unit' 
require 'rack/test' 

set :environment, :test 

class MyAppTest < Test::Unit::TestCase 
    include Rack::Test::Methods 

    def app 
    Sinatra::Application 
    end 

    def test_hi_returns_hello_world 
    get '/hi' 
    assert last_response.ok? 
    assert_equal 'Hello World!', last_response.body 
    end 
end 

你应该确保你已经安装了正确的宝石:

gem install sinatra rake rack-test 

现在可以运行你的应用程序和测试如下:

ruby my_app.rb 
ruby my_app_test.rb 
+0

我很喜欢这个解决方案。你能告诉我为什么我们在这里使用方法'app'? – 2017-05-28 17:21:52

0

我发布了一个small example根据psyho's answer。我还加入了ActiveRecord支持,包括测试夹具。

我配置耙运行测试:

# Rakefile 
require_relative './app' 
require 'rake' 
require 'rake/testtask' 
require 'sinatra/activerecord/rake' 

Rake::TestTask.new do |t| 
    t.pattern = "test/**/*_test.rb" 
end 

task default: :test 

现在我可以运行测试是这样的:

rake 

的试验例看起来是这样的:

require_relative '../test_helper' 

class BlogTest < ActiveSupport::TestCase 
    fixtures :blogs 

    def test_create 
    blog = Blog.create(:name => "Rob's Writing") 
    assert_equal "Rob's Writing", blog.name 
    end 

    def test_find 
    blog = Blog.find_by_name("Jimmy's Jottings") 
    assert_equal "Stuff Jimmy says", blog.tagline 
    end 
end 

我在每个测试文件中都需要这个帮助器来连接所有东西:

# test_helper.rb 
require_relative '../app' 
require 'minitest/autorun' 
require 'active_record' 
require 'rack/test' 

ActiveRecord::Base.establish_connection(:test) 

#Set up fixtures and such 
class ActiveSupport::TestCase 
    include ActiveRecord::TestFixtures 
    include ActiveRecord::TestFixtures::ClassMethods 
    include Rack::Test::Methods 

    def app 
    Sinatra::Application 
    end 

    self.fixture_path = 'test/fixtures' 
    self.use_transactional_fixtures = true 
    self.use_instantiated_fixtures = false 
end