2012-06-15 3 views
0

Я пытаюсь протестировать приложение проверки подлинности ruby ​​с помощью minitest и webrat, но получить ошибки.Приемочное тестирование приложения sinatra с использованием webrat не работает

тесты, такие как visit '/' неудачу с ошибкой Status 200 expected but was 404.

тесты, содержащие код, как fill_in :email, :with => "[email protected]" неудачно с ошибкой Could not find field: :email.

Я прочитал несколько документов о синатрах, испытаниях и webrat и форумах. Некоторые из них были старыми и предлагали такие вещи, как Sinatra :: Default, но github.com/brynary/webrat/wiki/sinatra, Building a Sinatra App Driven By Webrat Tests и Learning From the Masters: Sinatra Internals являются новыми, но они все еще терпят неудачу.

В принципе, мне не понравился синтаксис rspec, огурца и т. П., Но я хочу, чтобы он развивался поведением. Мне очень нравится минимальный синтаксис, как тесты, так и вывод, и именно поэтому я выбираю webrat для BDD. Если я ошибаюсь в ожидании того, что 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

Использование Sinatra с Webrat должно работать нормально. Я думаю, что ошибки, которые вы видите вызваны следующим способом (вокруг линии 18 в тестовом файле):

def app 
    Sinatra::Application.new 
end 

Это настройка базового класса Sinatra :: Application, чтобы запустить тесты против, когда вы действительно нужно создать свой собственный подкласс Kimsin (потому что вы создаете модульный стиль Синатра приложение), т.е.

def app 
    Kimsin.new 
end 

404 ошибки и пропущенные поля происходит потому, что Sinatra :: Application не определяет какой-либо из маршрутов вы тестируете.

Вы также можете взглянуть на Capybara, если вы ищете похожие варианты для Webrat.

+0

Спасибо, это определенно запустило приложение, так как в настоящее время работает работа с URL-адресами. Но я все еще получаю такие ошибки, как «Не могу найти поле:: email» и «Не удалось найти ссылку с текстом или названием или идентификатором« Вход ». Я тоже проверил его с Capybara, и у него свои ошибки, я добавил их по соответствующему вопросу. Есть ли информация или файл, который я должен предоставить, чтобы получить помощь по этому поводу? – barerd

+0

Я не вижу ничего плохого в вызовах 'fill_in' или' click_link', которые вы делаете, поэтому кажется, что что-то еще пошло не так, и эти элементы действительно не существуют. Быстрый способ отладки этих проблем состоит в том, чтобы вызвать 'save_and_open_page' непосредственно перед неудачной строкой в ​​вашем тесте, чтобы вы могли видеть веб-страницу в момент сбоя. Часто это свидетельствует об ошибке. Чтобы выполнить эту работу, вам нужно установить «запуск». – Steve

+0

save_and_open_page работал отлично. Они показали мне, что моя сессия [: errors] вызвала проблему на странице входа, если ранее не был зарегистрирован пользователь. Я не мог заметить это случайно, потому что мои тесты были в строгом порядке (получить индекс, зарегистрировать нового пользователя, зарегистрировать плохой пользователь/пароль, логин и т. Д.). – barerd