2011-08-17 72 views
3

我有一個非常簡單的Sinatra應用程序,我有麻煩測試。Sinatra測試總是404'ing

基本上,每一個請求測試返回404當我在該請求工作正常的瀏覽器測試知道。任何想法可能是什麼問題?

test_helper.rb中:

ENV["RACK_ENV"] = 'test' 

$: << File.expand_path(File.dirname(__FILE__) + '/../lib') 
require 'app' 
Sinatra::Synchrony.patch_tests! 

class Test::Unit::TestCase 
    include Rack::Test::Methods 
end 

app_test.rb

require 'test_helper' 
class AppTest < Test::Unit::TestCase 
    def app 
    @app ||= Sinatra::Application 
    end 
    def test_it_says_hello 
    get "/" 
    assert_equal 200, last_response.status 
    end 
end 

app.rb

$: << 'config' 
require "rubygems" require "bundler" 

ENV["RACK_ENV"] ||= "development" 
Bundler.require(:default, ENV["RACK_ENV"].to_sym) 
require ENV["RACK_ENV"] 

class App < Sinatra::Base register Sinatra::Synchrony 
    get '/' do 
    status 200 
    'hello, I\'m bat shit crazy and ready to rock' 
    end 
end 

的Gemfile

source :rubygems 

gem 'daemons' 
gem 'sinatra' 
gem 'sinatra-synchrony', :require => 'sinatra/synchrony' 
gem 'resque' 
gem 'thin' 

group :test do 
    gem 'rack-test', :require => "rack/test" 
    gem 'test-unit', :require => "test/unit" 
end 

爲什麼我不能得到這個通常很簡單的工作?

+0

得到西納特拉測試充分了解你仍然可以得到404,當你更換'@app || =西納特拉: :Application'在你的測試中使用:'@app || = App'? – daddz

+0

或嘗試'@app || = App.new' – daddz

回答

0

想通了。

app.rb

$: << 'config' 
require "rubygems" require "bundler" 

ENV["RACK_ENV"] ||= "development" Bundler.require(:default, 
ENV["RACK_ENV"].to_sym) require ENV["RACK_ENV"] 

class App < Sinatra::Base 
    register Sinatra::Synchrony 
end 

get '/' do 
    status 200 
    'hello, I\'m bat shit crazy and ready to rock' 
end 
+0

使用類/ modular-風格和相同文件/項目中的非類風格看起來不太「乾淨」。也許試試我在其他評論中寫的內容! – daddz

0

這似乎是合乎邏輯的,但您的路線配置是否正確?如果路線配置不正確,它會向左和向右扔404個錯誤。

+0

該頁面在瀏覽器中工作。 Sinatra有沒有其他真正的路由配置? –

+0

類似的問題與解決方案在這裏:http://stackoverflow.com/questions/6145819/why-am-i-getting-404-errors-with-sinatra-with-passenger-under-nginx – dwmcc

2

在你app_test.rb做到這一點,而不是你現在擁有的一切:

def app 
    @app ||= App.new 
    end 

這將與你的類的工作作風就像你在開始的時候有它,不需要切換到非類/模塊化風格。

6

我只有HTTP-404返回的問題有相同的問題。

我在「app」函數中給出了另一個返回來解決它。

class IndexClassTest < Test::Unit::TestCase 

    def app 
     @app = Foxydeal #appname NOT Sinatra::Application 
    end 
... 
  1. 此外

Sinatra::Synchrony.patch_tests!

似乎是過時的。

+0

這對我有用。我正在使用rspec,並能夠退出,只是返回的應用程序名稱,而不分配給一個實例變量。 – randallreedjr