目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

テスト駆動開発入門をPythonで写経してみた。6

ちょっとずつ書いていきます。

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()