mock - 用于引发异常的补丁类方法

han*_*son 5 python testing django unit-testing mocking

这是我尝试使用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 ''
Run Code Online (Sandbox Code Playgroud)

在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')
Run Code Online (Sandbox Code Playgroud)

运行测试时,mock会引发AttributeError说:"Stuff没有属性'method_b'"

我在这做错了什么?

Mat*_*zzi 8

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

@mock.patch.object('Stuff', 'method_b', some_error_mock)
Run Code Online (Sandbox Code Playgroud)

应该成为

@mock.patch.object(Stuff, 'method_b', some_error_mock)
Run Code Online (Sandbox Code Playgroud)

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