首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Ruby on Rails 開發從頭來(二十七):測試驅動開發 (TDD) 實戰範例

     編輯:Java 相關知識

TDD 循環:紅-綠-重構

  1. 紅:先寫失敗的測試,定義預期行為
  2. 綠:寫最少程式碼通過測試
  3. 重構:在測試保護下優化程式碼結構

需求:商品搜尋功能

用戶可依書名搜尋商品,顯示符合結果列表。

步驟 1:產生控制器與測試骨架

ruby script/generate controller Search search

產生 app/controllers/search_controller.rb、test/functional/search_controller_test.rb、app/views/search/search.rhtml。

步驟 2:撰寫失敗測試

在 test/functional/search_controller_test.rb:

def test_search
  get :search, :title => "Pragmatic Version Control"
  assert_response :success
  assert_equal "Found 1 product(s).", flash[:notice]
  assert_template "search/results"
  
  products = assigns(:products)
  assert_not_nil products
  assert_equal 1, products.size
  assert_equal "Pragmatic Version Control", products[0].title
  
  # 驗證視圖結構:外層 div.results 內含一個 div.catalogentry
  assert_tag :tag => "div", :attributes => { :class => "results" },
             :children => { :count => 1, :only => { :tag => "div", :attributes => { :class => "catalogentry" } } }
end

執行測試 → 失敗(紅)。

步驟 3:最小實作通過測試(綠)

控制器實作

class SearchController < ApplicationController
  def search
    @products = Product.find(:all, :conditions => ['title = ?', params[:title]])
    if @products.any?
      flash[:notice] = sprintf('Found %d product(s).', @products.size)
    end
    render :action => 'results'
  end
  
  def results; end  # 空動作,對應 results.rhtml
end

視圖實作

app/views/search/results.rhtml:

<h1>Search Results</h1>
<div class="results">
  <div class="catalogentry">
    <%= render :partial => 'product', :collection => @products %>
  </div>
</div>

app/views/search/_product.rhtml (部分模板):

<div class="product">
  <h3><%= h(product.title) %></h3>
  <p><%= h(product.description) %></p>
  <p>Price: <%= fmt_dollars(product.price) %></p>
</div>

搜尋表單

app/views/search/search.rhtml:

<%= form_tag :action => 'search' %>
  <p>Book title: <%= text_field_tag 'title' %></p>
  <p><%= submit_tag 'SEARCH' %></p>
<%= end_form_tag %>

步驟 4:執行測試全部通過

ruby test/functional/search_controller_test.rb
# Finished in 0.094 seconds.
# 1 tests, 7 assertions, 0 failures, 0 errors

步驟 5:重構與擴充

  • 將搜尋邏輯移至模型 Product.search(title) 類別方法
  • 加入分頁(will_paginate)
  • 支援多欄位模糊搜尋(標題、描述、ISBN)
  • 加入搜尋結果排序選項
  • 撰寫邊界測試:空關鍵字、特殊字元、SQL 注入防護

TDD 核心心法

  • 測試即規格文件,隨時可執行驗證
  • 先想「如何驗證」再想「如何實作」
  • 小步快跑,每次只讓一個測試通過
  • 重構不改變行為,只改善結構
  • 測試失敗是好事,代表發現問題早
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved