1

次のようなコードを適切なオブジェクト指向の方法で設計およびテストしようとしていますか? (またはpythonicの方法?)

以下は、人の名前が長いか短いかを決定するファクトリ クラスです。

class NameLengthEvaluator(object):
    def __init__(self, cutoff=10)
        self.cutoff = cutoff

    def evaluate(self, name):
        if len(self.name) > cutoff:
            return 'long'
        else:
            return 'short'

以下は、自分の名前の長さについて意見を持つ人のクラスです。

 class Person(object):
     def __init__(self, name=None, long_name_opinion=8):
         self.name = name

     def name_length_opinion(self):
         return 'My names is ' + \
                    NameLengthEvaluator(long_name_opinion).evaluate(self.name)

いくつかの質問:

  • Personメソッドname_length_opinion()は単体テストに値しますか? もしそうなら、それはどのようになりますか?
  • 一般に、完全に外部の機能を持つクラスの単純なメソッドをテストする良い方法はありますか?

このメソッドのテストは、その実装を再記述するだけであり、誰もコードに触れていないことを確認するためにテストが存在するだけのようです。

(免責事項:コードはテストされておらず、私はpythonが初めてです)

4

3 に答える 3

1

それは本当にそのコードのライフサイクルに依存します。現在の状態では、メソッドが明らかに正しいことは明らかであり、単体テストは、それがどのように動作するかについての仕様です。将来変更を加える予定がある場合 (NameLengthEvaluatorたとえば、別の方法で再実装するなど)、テストを実行するとリグレッションが検出されるため、単体テストを用意しておくと便利です。しかし、この場合、変更を加える可能性は低いと思われるため、テストはおそらく過剰です (適切な健全性チェックではありますが)。

于 2013-06-09T04:02:23.247 に答える
0

通常、ここではモックを使用します。NameLengthEvaluator連結されたものを記録したオブジェクトを返すモックを作成し、返されたときname_length_opinionに、それが使用され、正しいものと連結されていることを確認します。

たとえば、次を使用しunittest.mockます。

from unittest.mock import MagicMock, patch

@patch('your_module.NameLengthEvaluator', autospec=True)
def test_person_name_length_opinion(NameLengthEvaluator):
    expected_result = object()
    opinion = MagicMock(name='opinion')
    opinion.__radd__.return_value = expected_result
    name_length_evaluator = MagicMock(name='name_length_evaluator')
    name_length_evaluator.evaluate.return_value = opinion
    NameLengthEvaluator.return_value = name_length_evaluator

    name = object()
    length_limit = object()

    person = Person(name, long_name_opinion=length_limit)
    result = person.name_length_opinion()

    NameLengthEvaluator.assert_called_with(length_limit)
    name_length_evaluator.evaluate.assert_called_with(name)
    opinion.__radd__.assert_called_with('My names is ')
    assert result is expected_result

ただ、やり方は簡単なので、そこまで気にする必要はないと思います。

于 2013-06-09T04:13:41.940 に答える