ちょっとずつ書いていきます。
6章で実施したこと
- Franc、Dollarの親クラスMoneyの追加
- Franc、Dollarの__eq__()メソッドをMoneyに移動
本筋とは関係ないが実施したこと
- 意味をなしていないequals()メソッドの削除。__eq__()メソッドへの統合
前回も書きましたが、JUnitの場合、assertEquals()メソッドの中でequals()メソッドを呼んで同値かどうかを比較しているようです。対してPyUnitではassertEqual()メソッドの中で==演算子を利用して同値かどうかを比較しているようです。
Windows版Python2.5のunittest.py
# 170行目 class TestCase: # snip... # 328行目 def failUnlessEqual(self, first, second, msg=None): """Fail if the two objects are unequal as determined by the '==' operator. """ if not first == second: raise self.failureException, \ (msg or '%r != %r' % (first, second)) # sinp... # 370行目 # Synonyms for assertion methods assertEqual = assertEquals = failUnlessEqual
money.py
#!/usr/bin/env python # coding: utf-8 """テスト駆動開発入門 6章 再度、すべてに対する等価性 """ class Money(object): def __eq__(self, other): return self._amount == other._amount 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 """テスト駆動開発入門 6章 再度、すべてに対する等価性 """ import unittest from money import * class TestMoney(unittest.TestCase): """moneyモジュールのテスト """ def testMultiplication(self): """かけ算のテスト """ five = Dollar(5) self.assertEqual(Dollar(10), five.times(2) ) self.assertEqual(Dollar(15), five.times(3) ) def testFrancMultiplication(self): """Francクラスのかけ算のテスト """ five = Franc(5) self.assertEqual(Franc(10), five.times(2) ) self.assertEqual(Franc(15), five.times(3) ) def testEuality(self): """同値テスト """ self.assert_( Dollar(5) == Dollar(5) ) self.assert_(not Dollar(5) == Dollar(6) ) self.assert_( Franc(5) == Franc(5) ) self.assert_(not Franc(5) == Franc(6) ) if __name__ == "__main__": unittest.main()