2012-06-15 72 views
0

我正在嘗試使用minitest和webrat測試ruby驗證應用程序,但遇到錯誤。使用webrat的sinatra應用程序的驗收測試失敗

試驗等visit '/'失敗,錯誤Status 200 expected but was 404.

含有像fill_in :email, :with => "[email protected]"代碼測試失敗,錯誤Could not find field: :email

我讀了幾個sinatra,測試和webrat文檔和論壇。其中一些是舊的,並建議像西納特拉::默認的東西,但github.com/brynary/webrat/wiki/sinatra,Building a Sinatra App Driven By Webrat TestsLearning From the Masters: Sinatra Internals是新的,但他們仍然失敗。

基本上,我不喜歡rspec,黃瓜等類似句子的語法,但確實想做行爲驅動開發。我非常喜歡minitest的語法,測試和輸出,這就是爲什麼我選擇用於BDD的webrat。如果我錯在期待webrat滿足驗收測試要求,請告訴我應該使用這個框架或那個框架。

除此之外,主文件和測試文件的第一部分如下。我希望有人能解釋我,我錯過了什麼?

test_file裏面

require "test/unit" 
require "minitest/autorun" 
require "rack/test" 
require 'webrat' 
require_relative "../lib/kimsin.rb" 

Webrat.configure do |config| 
    config.mode = :rack 
end 

ENV["RACK_ENV"] = "test" 

class KimsinTests < Test::Unit::TestCase 
    include Rack::Test::Methods 
    include Webrat::Methods 
    include Webrat::Matchers 

    def app 
    Sinatra::Application.new 
    end 

    def test_create_user 
    visit "/user/new" 
    fill_in :username, :with => "[email protected]" 
    fill_in :password, :with => "abC123?*" 
    fill_in :confirm_password, :with => "abC123?*" 
    click_link "Register" 
    assert 201, last_response.status, "Status 201 expected but was #{last_response.status}.\n#{error}" 
    assert_contain /Logged in as [email protected]/, "No user created" 
    assert_contain /Logout/, "Logout link not present" 
    end 

main_file

require "sinatra" 
require "erb" 
require_relative "../lib/kimsin/version" 
require_relative "../lib/kimsin/user" 

class Kimsin < Sinatra::Application 
    use Rack::Session::Pool, :expire_after => 2592000 
    set :session_secret, BCrypt::Engine.generate_salt 

    configure :development do 
    DataMapper.auto_migrate! 
    end 

    get "/" do 
    if session[:user_id] 
     user = User.get session[:user_id] 
     email = user.email 
     erb :index, :locals => { :email => email } 
    else 
     email = nil 
     erb :index, :locals => { :email => email } 
    end  
    end 

回答

0

使用西納特拉與Webrat應該正常工作。我認爲,您看到的錯誤是由下面的方法(約18行中的測試文件)引起:

def app 
    Sinatra::Application.new 
end 

這是建立西納特拉::應用基類來運行你對當你測試真的需要建立自己的子類Kimsin(因爲你正在創建一個模塊化的風格西納特拉的應用程序),即

def app 
    Kimsin.new 
end 

的404錯誤和丟失的領域正在發生,因爲西納特拉::應用沒有定義任何的路線你正在測試。

如果您正在尋找類似於Webrat的替代品,您可能還需要查看Capybara

+0

謝謝你,這絕對啓動了應用程序,因爲訪問網址正在工作。但是我仍然遇到像'找不到字段::電子郵件'和'無法找到帶有文本或標題或ID的鏈接'Login'的錯誤。我也檢查了它與水豚,它也有自己的錯誤,我加入他們的相關問題。有沒有更多的信息或文件我應該提供以獲得關於此的幫助? – barerd

+0

我沒有看到你正在創建的'fill_in'或'click_link'調用有什麼問題,所以看起來可能出現其他問題,並且這些元素確實不存在。調試這些類型問題的一種快速方法是在測試失敗之前調用'save_and_open_page',以便在出現故障時能夠看到網頁。通常這揭示了一個錯誤。你需要安裝'launchy' gem來完成這項工作。 – Steve

+0

save_and_open_page效果很好。他們告訴我,如果沒有用戶註冊過,我的會話[:錯誤]會在登錄頁面中造成問題。我無法意識到這一點,因爲我的測試是嚴格的順序(獲得索引,註冊新用戶,註冊不好的用戶/密碼,登錄用戶等)。 – barerd

相關問題