如何模拟实例变量

时间:2017-02-14 23:26:52

标签: 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(
            name='Some Name',
            thing='Some Thing',
            # self.something is defined in SuperClass.__init__()
            cool=self.something.cool(),
        )

在我的测试中,我模拟了Foo课程并致电assert_called_once_with()以确保self._foo设置正确。但是,我无法弄清楚如何获得self.something.cool()的返回值。

当然,我可以将返回值设置为self下的实例变量,并在我的测试中使用它,但这似乎是一个丑陋的解决方案。有没有办法让我patch()来做这件事?

1 个答案:

答案 0 :(得分:0)

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

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'

希望这能解决你的问题,因为我的目的是解释一个模拟的返回值和一个断言的返回值。

  • 代码未经过测试也无法运作,只是一个例子