注意:TDD勉強会会用の資料です。
殴り書きしてあとで清書していくので投稿段階では綺麗ではありません。
Dollarのtimesメソッドは、自身の金額とmultiplier引数を掛けた値を保持するDollarを返すべき。
ここまで書いていたテストからは、Dollarを返すことは伝わりにくいので最初のアサーションを修正して、Dollar同士を直接比較する。
この部分
playground.swift
func TestMultiplication(){
var five = Dollar(5)
var Product:Dollar = five.times(2);
assert(Product.amount == 10)
Product = five.times(3);
assert(Product.amount == 15)
}
以下のようにamountを消し去りたい。
playground.swift
func TestMultiplication(){
var five = Dollar(5)
assert(Dollar(10) == five.times(2))
assert(Dollar(15) == five.times(3))
}
全コード
swiftだとEquatableが必要。
playground.swift
var money = MoneyTest()
money.TestMultiplication()
money.TestEquality()
class MoneyTest{
init(){}
func TestMultiplication(){
var five = Dollar(5)
assert(Dollar(10) == five.times(2))
assert(Dollar(15) == five.times(3))
}
func TestEquality(){
assert(Dollar(5) == Dollar(5))
assert(Dollar(6) == Dollar(6))
}
}
class Dollar :Equatable {
private var amount:Int
init(_ amount:Int){
self.amount = amount
}
func times(_ multiplire:Int) -> Dollar{
return Dollar(self.amount * multiplire)
}
///なんか本書読んで似たような関数作ったけどと、そいやEquatableに準拠させるだけでオブジェクトの比較可能なんですよねーーーー
//
// func equals(_ Object:Any) -> Bool{
// var dollar:Self = Object as! Self
// return dollar.amount == self.amount
// }
static func == (lhs: Dollar, rhs: Dollar) -> Bool {
return lhs.amount == rhs.amount
}
}
効果
amountをprivateにできた。
リスク
等価性比較が正確に実装されていることを検証できていない場合、掛け算が正しくできていることを検証できていないということになる。
リスクに対し
完壁を求めない。
コードとテスト両方の視点から捉えることによって欠陥を減らし、自信を持って前に進む。
欠陥を見逃してしまう時は「どんなテストが書かれるべきであったか」という教訓を形にして前に進む。
この章の振り返り
・作成したばかりの機能を使って、テストを改善した。
・そもそも正しく検証できていないテストが2つあったら、お手上げ。
・リスクを受け入れて先に進んだ。
・テストコードとプロダクトコードの間の結合度を下げた。