1

私はいくつかのテストを行うために小さなモッククラスを書いています。

ただし、このクラスは、ネストされた属性を持つという考えをサポートする必要があります。

この例は、問題に対する洞察を提供するはずです。

class Foo(object):

    def __init__(self):
        self.x = True

上記のクラスから、次のことができます。

f = Foo()
f.x

AttributeErrorを回避するためにフォールバックする属性を追加できることはわかっていますが__getattr__、このようなものを有効にする必要がある場合はどうなりますか?

f = Foo()
f.x
f.x.y
f.x.y.z()

オブジェクトがとして呼び出された場合に何を返すかはわかっていますが、f.x.y.z()それを実現する方法を見つける必要がありますz()

4

2 に答える 2

3

各属性アクセスで、「なんでもモック」クラスの別のインスタンスを返すことで、「何でもモック」できます (パーツを機能させたい場合は、これも呼び出し可能でなければなりません.z();-)。

例えば:

class MockAny(object):

  # mock special methods by making them noops
  def __init__(self, *a, **k): pass

  # or returning fixed values
  def __len__(self): return 0

  # mock attributes:
  def getattr(self, name):
    return MockAny()

  # make it callable, if you need to
  def __call__(self, *a, **k):
    return MockAny()

もちろん、別の方法は、キャッチオールアプローチを取るのではなく、(内省、または何らかの形式の「宣言的記述」、または単に特定のもののモックをコーディングすることによって;-)モックしているものを知ることです。 ; ただし、上記の (部分的な) 例でわかるように、後者も実行可能です。

個人的には、この特定の車輪を再発明するのではなく、 pymoxなどの既存のモック フレームワークを使用することをお勧めします(また、そのようなフレームワークのソース コードは、このような SO の合理的に簡潔な応答よりも有益な場合があります;-)。

于 2010-07-31T03:07:32.877 に答える
1

単体テストで次のようなものを呼び出している場合はf.x.y.z()、テストしすぎている可能性があります。これらのネストされた属性のそれぞれは、特定のクラスの単体テストでカバーする必要があります。

クラスをもう一度見て、Foo単体テストで独自の動作をテストできるかどうかを確認してください。

あなたが探していた答えではないかもしれませんが、長期的には役立つものになることを願っています.

于 2010-07-31T06:21:31.657 に答える