昨天我們寫了 Game Class
準備將 chat_room_channel.rb
的遊戲處理邏輯搬出來。
但
在改動一個原本功能正常的程式碼時,要如何確保改完不會影響既有的功能?
我們可以利用測試來驗證程式仍然運作正常
以下我們使用 RSpec 來撰寫測試案例,讓我們可以安心重構程式碼,改壞時能夠第一時間處理,減少出現 Bug 炸到使用者的情況 XD
https://github.com/rspec/rspec-rails
選擇安裝整合好 Rails 的 rspec-rails
$ bundle add rspec-rails
$ rails generate rspec:install
可以用 RSpec generator 產生 spec
$ rails generate rspec:model Game
# create spec/models/game_spec.rb
產生的內容
require 'rails_helper'
RSpec.describe Game, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
執行測試
$ rspec
在遊戲物件初始化時,會從 GameRoom
的 game_data
拿出資料,組成 Game
的實體。
一個 Game
應該要有
其中狀態(state)表示遊戲正處於哪個階段
STATE = {
GAME_INIT: 0,
GAME_PROCESSING: 1,
GAME_ENDING: 2,
GAME_COMPLETED: 3
}
在 GAME_INIT
時,
遊戲
STATE[GAME_INIT]
據此
來撰寫我們的 game_spec.rb
RSpec.describe Game, type: :model do
context "#new" do
let(:game_room) { GameRoom.create(name: "new game", game_data: {}) }
let(:game) { Game.new(game_room) }
it "要有名稱" do
expect(game.name).to be_truthy
end
it "要有模式" do
expect(game.mode).to be_truthy
end
it "狀態是 `STATE[GAME_INIT]`" do
expect(game.state).to eq Game::STATE[:GAME_INIT]
end
it "參與的玩家 >= 1" do
expect(game.players.size).to be >= 1
end
it "要有資料庫的ID" do
expect(game.id).to be_truthy
end
end
end
跑看看測試
app/models/game.rb
+ MODE = {
+ "基本 5 色": 0,
+ "6 色 10 張": 1,
+ "6 色 5 張": 2,
+ "彩色": 3,
+ }
- attr_accessor :name, :state, :game_room_id, :game_room
+ attr_accessor :id, :name, :mode, :players, :state, :game_room_id, :game_room
- @name = params.dig :name
- @players = []
+ @id = game_room.id
+ @name = game_room.name
+ @mode = params.dig "mode"
+ @players = params.dig "players"
在建立遊戲時,傳入建立的玩家作為第一個玩家
spec/models/game_spec.rb
+ let(:host) { SecureRandom.urlsafe_base64 }
- let(:game_room) { GameRoom.create(name: "new game") }
+ let(:game_room) { GameRoom.create(name: "new game", game_data: {mode: 0, players: [host]}) }
順利通過啦
$ rspec --help
Usage: rspec [options] [files or directories]
-f, --format FORMATTER Choose a formatter
[p]rogress (default - dots)
[d]ocumentation (group and example names)
[h]tml
[t]extmate
custom formatter class name
可以使用 rspec -fd
獲得每項測試的說明
慢慢將遊戲邏輯搬出來
Demo url -> https://ironman2023-hanabi.zeabur.app/
痾... 我不小心把你的遊戲房間刪掉了.......
我以為是我在前幾天建立的房間..............
XDD
沒擋就是開放給大家玩的