Ruby on Rails ショッピングカート part9_5 テスト実行

Ruby on Rails において ショッピングカート とは以下を示します。

  1. ローカル
     レンタルサーバーだとDBが1つしかないので、
     これからはローカル上で作業を進めて行きたいと思う。
    
  2. 実行環境の切り替え
     ローカル環境でのテストデータベースへの切り替えは
     以下のコマンドで行う。
    
     %cd depot
     %ruby script/server -e test
    
    • Apache、lighttpdを使用している場合
       RAILS_ENV環境変数を設定すれば良い。
      
  3. テストフィクスチャ
     こんな感じでテストデータを作成する。
    
    1. /test/fixtures/products.yml
       version_control_book:
         id: 1
         title: Pragmatic Version Control
         description: バージョン管理の使用方法
         image_url: /images/sk_auto_small.jpg
         price: 29.95
         date_available: 2005-01-26 00:00:00
      
       automation_book:
         id: 2
         title: Pragmatic Project Automation
         description: プロジェクトを自動化する方法
         image_url: /images/Nature1-010.jpg
         price: 29.95
         date_available: 2004-07-01 00:00:00
      
       automation_book:
         id: 3
         title: Future-Proofing Your Tests
         description: 時の流れに打ち勝つ方法
         image_url: /images/Nature1-011.jpg
         price: 29.95
         date_available: <%= 1.day.from_now.strftime("%Y-%m-%d %H:%M:%S") %>
      
  4. テスト実行
     こんな感じでテストケースを作成していく。
     しかし、本では「テストメソッドの独立性」を唱えていたが、
     実現できてない。・・・・・どうして!?
    
    1. /test/unit/product_test.rb
       require File.dirname(__FILE__) + '/../test_helper'
      
       class ProductTest < Test::Unit::TestCase
         fixtures :products
      
         def setup
           @product = Product.find(1)
         end
      
         # Replace this with your real tests.
         def test_truth
           assert_kind_of Product, @product
         end
      
         def test_create
           assert_kind_of Product, @product
           assert_equal 1, @product.id
           assert_equal "Pragmatic Version Control", @product.title
           assert_equal "バージョン管理の使用方法", @product.description
           assert_equal "/images/sk_auto_small.jpg", @product.image_url
           assert_equal 29.95, @product.price
           assert_equal "2005-01-26 00:00:00", @product.date_available_before_type_cast
         end
      
       #  def test_update
       #    assert_equal 29.95, @product.price
       #    @product.price = 99.99
       #    assert @product.save, @product.errors.full_messages.join("; ")
       #    @product.reload
       #    assert_equal 99.99, @product.price
       #  end
      
       #  def test_destroy
       #    @product.destroy
       #    assert_raise(ActiveRecord::RecordNotFound) { Product.find(@product.id) }
       #  end
      
       #  def test_validate
       #    assert_equal 29.95, @product.price
       #    @product.price = 0.00
       #    assert !@product.save
       #    assert_equal 1, @product.errors.count
       #    assert_equal "should be positive", @product.errors.on(:price)
       #  end
      
       end
      
    2. 結果
     "_before_type_cast"を付けないとTimeオブジェクトと比較してしまう。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/154_01_before_type_cast.jpg
     なんかメソッドの独立性がなっていない。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/154_02_method_data_change.jpg
     あと2007年2月10日時点では、validate()は実装してなかったので、
     テストする時は以下のコードを追加して!!追加しないと以下のエラー
     が出てしまう。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/154_03_validate.jpg
       def validate  #:doc:
         errors.add(:price, "should be positive") unless price.nil? || price >= 0.01
       end
      

ご訪問頂き有難う御座います。 当サイトを効率良く使うためにまずは FrontPage を見て下さい。 検索方法、一覧表示などの各情報を纏めています。
当サイトの説明 → Frontpage