0

minitest と webrat を使用して Ruby 認証アプリをテストしようとしていますが、エラーが発生します。

visit '/'エラーで失敗するようなテストStatus 200 expected but was 404.

のようなコードを含むテストはfill_in :email, :with => "first@company.com"、エラーで失敗しますCould not find field: :email

私はいくつかのsinatra、testing、webratのドキュメントとフォーラムを読みました。それらのいくつかは、Sinatra::Default のような古くて提案されたものでしたが、github.com/brynary/webrat/wiki/sinatraWebrat テストによって駆動される Sinatra アプリの構築マスターからの学習: Sinatra 内部は新しいですが、それでも失敗します.

基本的に、rspec やキュウリなどの文のような構文は好きではありませんでしたが、ビヘイビア駆動の開発を行いたいと考えています。テストと出力の両方で、ミニテストの構文が本当に好きなので、BDD に webrat を選びました。Webrat が受け入れテストの要件を満たすと期待するのが間違っている場合は、このフレームワークまたはそのフレームワークを使用する必要があることを教えてください。

それとは別に、メイン ファイルとテスト ファイルの最初の部分を以下に示します。誰かが私に説明してくれるといいのですが、何が足りないのですか?

テストファイル

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 => "first@company.com"
    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 first@company.com./, "No user created"
    assert_contain /Logout/, "Logout link not present"
  end

メインファイル

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
4

1 に答える 1

0

Webrat で Sinatra を使用すると、問題なく動作するはずです。表示されているエラーは、次の方法が原因であると思います (テスト ファイルの 18 行目あたり)。

def app
  Sinatra::Application.new
end

これは、Sinatra::Application 基本クラスをセットアップして、独自のサブクラスを本当にセットアップする必要があるときにテストを実行しますKimsin(モジュラー スタイルの Sinatra アプリを作成しているため)。つまり、

def app
  Kimsin.new
end

Sinatra::Application はテストしているルートを定義していないため、404 エラーと欠落フィールドが発生しています。

Webrat に類似した代替手段を探している場合は、Capybaraも参照してください。

于 2012-06-16T20:11:49.280 に答える