【问题标题】:How to mock instance variables如何模拟实例变量
【发布时间】:2017-02-14 23:26:51
【问题描述】:

我正在尝试为这样的类编写测试:

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() 来做到这一点?

【问题讨论】:

  • 还有here
  • @user2357112:虽然mock_calls 很有帮助,但我不知道如何将self.something 修补到MagicMock 对象中。
  • 为什么需要这样做?你说你试图得到self.something.cool()的返回值。修补 self.something 似乎正在修补你正在尝试测试的东西。
  • 如果您想要该返回值,请检查调用 Foo 的内容,因为 Foo 记录了该值。

标签: python unit-testing mocking


【解决方案1】:

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

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'

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

  • 代码未经测试也不应该工作,这只是一个例子

【讨论】:

  • 我想确保self._foo 被正确创建。你是在建议我 patch Foo 上课并做 assert mocked_foo.return_value == self._foo 吗?如果是这样,测试将无法捕获 name 意外从 Some Name 更改为 Same Name 的错误。
猜你喜欢
  • 2013-07-17
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多