iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
SideProject30

用 Rails 打造你的電商網站系列 第 26

Day 26 - 測測你寫的程式碼!

  • 分享至 

  • xImage
  •  

前置作業:完成購物車 CRUD / 根據購物車商品做金額及件數的變化 / 測試所需要的假資料

再來我們要進入重點了,開始寫測試

因為整個專案要測的地方應該蠻多的

今天應該就是介紹單元測試及整合測試的例子

但在這之前,還是要先介紹一個工具給大家 - Capybara

Capybara

水獺是我們的測試好朋友,在寫好測試的時候,我們會用它來跑使用者的流程

看看流程哪邊不順,或者有沒有出現預期的效果或畫面等等

設定 FacotryBot

為了讓我們在測試的時候更方便,我們需要做以下設定

讓我們在使用 FactoryBot 的方法時,不需要加上 FactoryBot. 前綴

# spec/support/factory.rb

RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end

接著要到 rails_helper 裡面設定 factory 的檔案放在哪裡

# spec/rails_helper.rb

Dir[Rails.root.join('./spec/support/**/*.rb')].each { |f| require f }

spec_helper(放置 Rspec 測試的相關設定) 載入 rails_helper

# spec/spec_helper.rb

require 'rails_helper'

設定 capybara

如果要看畫面的話,要把 _headless 拿掉

以下是比較陽春的設定,詳細的設定可參閱官網或尋找相關資源

# spec/support/capybara.rb

Capybara.current_driver = :selenium_chrome_headless

Capybara.enable_aria_label = true

測試工具

我們會使用 rspec 來進行測試

安裝方式可看官方文件

單元測試

如之前提到的,單元測試是把功能切分成更細小的區塊來做,以我們的例子來說,可以測試購物車中的消費金額有多少

RSpec.describe '購物車', type: :model do
  let(:cart) { create(:cart, :has_two_drinks) }

  describe '加入購物車' do
    context "當購物車裡面有 2 個 100 元商品" do
      it '計算購物車總金額' do
        expect(cart.total_price).to eq 200
      end
    end
  end
end

整合測試

CRUD 這種基本的功能都歸類在整合測試中,其他附加的功能也算是整合測試的一種

我們就直接拿 新增飲品 來測試吧

RSpec.describe '飲品流程', type: :feature do
  let!(:user) { create(:user, :owner)}

  before do
    visit new_user_session_path
    page.find("#user_email").fill_in with: user.email
    page.find("#user_password").fill_in with: 'password'
    click_button '登入'
    expect(page).to have_content("登入成功")
  end

  describe '建立飲品' do
    context "當該填的欄位都填好" do
      it '應該要建立成功' do
        visit new_admin_drink_path
        fill_in :drink_name, with: '好喝的'
        fill_in :drink_price, with: Faker::Number.between(from: 150, to: 200)
        click_button '送出'
        expect(page).to have_content('飲品建立成功')
      end
    end
  end
end

測試分成三大部分 3A 原則

分別為 Arrange / Act / Assert,我們拿剛剛的買牛奶例子來解釋


Spec.describe '飲品流程', type: :feature do
  # Arrange 安排,將要測試的資料都備齊
  let!(:user) { create(:user, :owner)}

  before do
    visit new_user_session_path
    page.find("#user_email").fill_in with: user.email
    page.find("#user_password").fill_in with: 'password'
    click_button '登入'
    expect(page).to have_content("登入成功")
  end

  describe '建立飲品' do
    context "當該填的欄位都填好" do
      it '應該要建立成功' do
        visit new_admin_drink_path
        
        # Act 執行,撰寫方法並測試
        fill_in :drink_name, with: '好喝的'
        fill_in :drink_price, with: Faker::Number.between(from: 150, to: 200)
        click_button '送出'
          
        # Assert 驗收,執行結果是否符合預期規格
        expect(page).to have_content('飲品建立成功')
      end
    end
  end
end

上一篇
Day 25 - 假資料夢工廠
下一篇
Day 27 - 發大財之前要做好準備
系列文
用 Rails 打造你的電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言