如何模拟在同一文件中定义但未被测试方法导入的函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何模拟在同一文件中定义但未被测试方法导入的函数?相关的知识,希望对你有一定的参考价值。

到目前为止,我有以下代码:

import unittest
from mock import patch, Mock


def method_1():
    from math import ceil
    return ceil(1.2)


def test_1():
    m = Mock(return_value=10)
    with patch('math.ceil', m) as p:
        a = method_1()
        assert(a == 10)


def method_2():
    return method_1() + 1


def test_2():
    m = Mock(return_value=20)
    with patch('method_1', m) as p:
        a = method_2()
        assert(a == 21)

在运行测试时,我收到以下错误:

$ nosetests -s unittest.py 
.E
======================================================================
ERROR: unittest.test_2
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/srv/www/rpr/unittest.py", line 27, in test_2
    with patch('method_1', m) as p:
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1564, in patch
    getter, attribute = _get_target(target)
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1413, in _get_target
    (target,))
TypeError: Need a valid target to patch. You supplied: 'method_1'

----------------------------------------------------------------------
Ran 2 tests in 27.840s

FAILED (errors=1)

我能够正确地模拟math.ceil并且test_1没有任何问题。我很难嘲笑method_1本身。我该怎么做呢?

答案

我不得不将test_2更改为以下内容以使其正常工作:

def test_2():
    m = Mock(return_value=20)
    with patch(__name__ + '.method_1', m) as p:
        a = method_2()
        assert(a == 21)

以上是关于如何模拟在同一文件中定义但未被测试方法导入的函数?的主要内容,如果未能解决你的问题,请参考以下文章

Jest - 模拟函数,从另一个文件导入

Python 导入未被识别

如何在 ts-mock 中模拟导入的函数

Qt 插槽连接成功但未被触发

UITableViewCell 强引用周期,但未被 Instruments 中的 Leaks 拾取

python如何导入自定义文件和模块全部方法