【问题标题】:mock - patch class method to raise exception模拟 - 修补类方法以引发异常
【发布时间】:2014-02-15 10:57:06
【问题描述】:

这是我尝试使用 mock 测试的代码的通用示例。我得到一个 AttributeError。

这里是 __init__.py:

import logging
log = logging.getLogger(__name__)

class SomeError(Exception):
    pass

class Stuff(object):
    # stub

    def method_a(self):
        try:
            stuff = self.method_b()
        except SomeError, e:
            log.error(e)
            # show a user friendly error message
            return 'no ponies'
        return 'omg ponies'

    def method_b(self):
        # can raise SomeError
        return ''

在 tests.py 我有这样的东西:

import mock
import unittest

from package.errors import SomeError
from mypackage import Stuff

some_error_mock = mock.Mock()
some_error_mock.side_effect = SomeError

class MyTest(unittest.TestCase):

    @mock.patch.object('Stuff', 'method_b', some_error_mock)
    def test_some_error(self):
        # assert that method_a handles SomeError correctly
        mystuff = Stuff()
        a = mystuff.method_a()
        self.assertTrue(a == 'no ponies')

运行测试时,mock 会引发 AttributeError 说:“Stuff does not have the attribute 'method_b'”

我在这里做错了什么?

【问题讨论】:

  • 为什么叫它类方法呢?这不是实例方法吗?
  • 已经快三年了。我什至不记得这个问题与哪个项目相关,因为我用 Stuff 等替换了名称。

标签: python django unit-testing testing mocking


【解决方案1】:

装饰器第一个参数应该是对象的类,你误用了类名的字符串

@mock.patch.object('Stuff', 'method_b', some_error_mock)

应该变成

@mock.patch.object(Stuff, 'method_b', some_error_mock)

http://docs.python.org/dev/library/unittest.mock#patch-object

【讨论】:

  • 我不敢相信我忽略了这么简单的解释。谢谢!
猜你喜欢
  • 2020-06-17
  • 2018-11-10
  • 2016-04-18
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2019-07-31
  • 2015-03-08
  • 2013-03-09
相关资源
最近更新 更多