8章で実施したこと
- ファクトリメソッドパターンを適用し、サブクラスへの参照を減少させた
- times()メソッドをMoneyクラスで抽象メソッドとして宣言
Python2.5には抽象クラスが無いので、times()メソッドでNotImplementedErrorを発生させています。
money.py
#!/usr/bin/env python # coding: utf-8 """テスト駆動開発入門 8章 オブジェクトの生成 """ class Money(object): def times(multiplier): raise NotImplementedError @staticmethod def dollar(amount): return Dollar(amount) @staticmethod def franc(amount): return Franc(amount) def __eq__(self, other): return self._amount == other._amount and \ self.__class__ == other.__class__ class Dollar(Money): def __init__(self, amount): self._amount = amount def times(self, multiplier): return Dollar(self._amount * multiplier) class Franc(Money): def __init__(self, amount): self._amount = amount def times(self, multiplier): return Franc(self._amount * multiplier)
money_test.py
#!/usr/bin/env python # coding: utf-8 """テスト駆動開発入門 8章 オブジェクトの生成 """ import unittest from money import * class TestMoney(unittest.TestCase): """moneyモジュールのテスト """ def testMultiplication(self): """かけ算のテスト """ five = Money.dollar(5) self.assertEqual(Money.dollar(10), five.times(2) ) self.assertEqual(Money.dollar(15), five.times(3) ) def testFrancMultiplication(self): """Francクラスのかけ算のテスト """ five = Money.franc(5) self.assertEqual(Money.franc(10), five.times(2) ) self.assertEqual(Money.franc(15), five.times(3) ) def testEuality(self): """同値テスト """ self.assert_( Money.dollar(5) == Money.dollar(5) ) self.assert_(not Money.dollar(5) == Money.dollar(6) ) self.assert_( Money.franc(5) == Money.franc(5) ) self.assert_(not Money.franc(5) == Money.franc(6) ) self.assert_(not Money.franc(5) == Money.dollar(5) ) if __name__ == "__main__": unittest.main()