Python 如何模拟实例变量

Python 如何模拟实例变量,python,unit-testing,mocking,Python,Unit Testing,Mocking,我正试图为这样一个类编写一个测试: from public_library import SuperClass from another_library import Foo class MyClass(SuperClass): def __init__(self): # Call super class super(MyClass, self).__init__() self._foo = Foo( nam

我正试图为这样一个类编写一个测试:

from public_library import SuperClass
from another_library import Foo


class MyClass(SuperClass):

    def __init__(self):
        # Call super class
        super(MyClass, self).__init__()

        self._foo = Foo(
            name='Some Name',
            thing='Some Thing',
            # self.something is defined in SuperClass.__init__()
            cool=self.something.cool(),
        )
在我的测试中,我模拟了
Foo
类,并使用()调用了
assert\u called\u once\u,以确保
self.\u Foo
设置正确。但是,我不知道如何获取self.something.cool()的返回值


当然,我可以在
self
下设置实例变量的返回值,并在测试中使用它,但这似乎是一个丑陋的解决方案。是否有一种方法可以使用
patch()
来完成此操作?

测试逻辑的推荐方法是在最后断言预期结果。鉴于我们不知道您的逻辑,您可以期望返回任何值。当运行单元测试时,实际上可以调用函数并获得返回值。一个常见的例子:

def parse_http():
  response = socket.recvfrom(2048) # you don't want to wait for a connection to test your logic, so you mock it, how?
  return response[response.find('\r\n\r\n'):]

@patch('socket', 'recvfrom')
def testParseHttp(socket_recv_from):
  socket_recv_from.return_value = 'HTTP 1.1\r\n\r\nsomeresponse'
  assert parse_http() == 'someresponse'
希望这能澄清您的问题,因为我的目的是解释模拟返回值和断言返回值

  • 代码没有经过测试,也不应该工作,它只是一个示例

模拟。还有。@user2357112:虽然
mock\u调用
非常有用,但我不知道如何将
self.something
修补到
MagicMock
对象中。为什么需要这样做?您说过您正在尝试获取self.something.cool()的返回值。
。修补
self。某些东西似乎正在修补您正试图测试的东西。如果您想要该返回值,请检查调用了什么
Foo
,因为
Foo
记录了该值。我想确保
self.\u Foo
创建正确。您是否建议我
patch
Foo
类并执行
断言mocked\u Foo.return\u value==self.\u Foo
?如果是这样的话,测试将不会捕捉到
名称
意外地从
某个名称
更改为
相同名称
的错误。