1

pythonでは、メソッドに関するテストを作成するために、複数のドットを含む(クラス)メソッドを作成したいと考えていますxmlrpc。メソッドには、多くのドットを含むメソッド名を付けることができます。次のことだけを試すと:

class Foo(object):
    def method.with.many.dots(self):
        return 42

無効な構文があります。また、次のようなより洗練されたアイデアを使用しようとしました

class Foo(object):
    def __getattr__(self, attr):
        print attr

これは、ドットを含むメソッド名に対してもそのままでは機能しません。次のようなことができる単純なモックオブジェクトを作成する方法についてのアイデア

mock.some.test.with.many.dots()

xmlrpcサーバーを起動せずに簡単な方法でPythonコードで?

4

2 に答える 2

8
class Foo(object):
    def __init__(self):
        self._attr_path = []

    def __getattr__(self, attr):
        self._attr_path.append(attr)
        return self

    def __call__(self, *args, **kw):
        print ".".join(self._attr_path)
        print args, kw
        del self._attr_path[:]

f = Foo()
f.a.b.c(1,2,3)

この出力:

a.b.c
(1, 2, 3) {}

@Daira Hopwood の問題を修正するには:

class Bar(object):
    def __init__(self, foo, attr):
        self.foo = foo
        self._attr_path = [attr]

    def __getattr__(self, attr):
        self._attr_path.append(attr)
        return self

    def __call__(self, *args, **kw):
        print self
        print args, kw

    def __str__(self):
        return ".".join(self._attr_path)

class Foo(object):

    def __getattr__(self, attr):
        return Bar(self, attr)

f = Foo()
f.a.b.c(1,2,3)

@Daira Hopwood の問題を再度修正するには:

class Foo(object):

    def __init__(self, parent=None, name=""):
        self.parent = parent
        self.name = name

    def __getattr__(self, attr):
        return Foo(parent=self, name=attr)

    def __call__(self, *args, **kw):
        print self
        print args, kw    

    def __str__(self):
        nodes = []
        node = self
        while node.parent:
            nodes.append(node)
            node = node.parent
        return ".".join(node.name for node in nodes[::-1])

f = Foo()
x = f.a.b
y = f.a.c
x()
y()

g = f.a
f.b
g.b.c() 
于 2013-03-15T10:37:29.483 に答える
2

このソリューションは機能します

入力:

import mock
MO = mock.Mock()
MO.some.test.wyth.many.dots.return_value = 42
MO.some.test.wyth.many.dots()

出力:

42

「with」はキーワードです。

点線の各「子孫」は、独立した (モック) オブジェクトです。

于 2013-11-20T21:52:40.753 に答える