gpt4 book ai didi

python - 如何对方法应用@mock.patch并在一个或多个测试中保留对原始方法的访问?

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:43 25 4
gpt4 key购买 nike

在为 python 应用程序进行单元测试时,当 mock.patch 通过 start() 方法激活模拟时,我遇到了有趣的情况。要重现问题,请将下面的代码放入两个文件 tests.pyutils.py 中,并将它们放在一个文件夹下:

测试.py:

import mock
import unittest

import utils


class TestA(unittest.TestCase):

def setUp(self):
pass

def test_method_a(self):
mock.patch('utils.method_b', return_value=None).start()
actual_result = utils.method_a()
# Assertion code

def test_method_b(self):
actual_result = utils.method_b()
self.assertTrue(actual_result is None)

utils.py:

def method_a():
print 'A Method'
return method_b()

def method_b():
print 'B Method'
return True

请注意,test_method_a 模拟 app_utils.method_btest_method_b 将调用原始 app_utils.method_b。我遇到了 test_method_b 无法调用实际的 app_utils.method_b 的情况,因为它被 test_method_a 模拟了。

我知道解决该问题的几种方法:

  • 使用from app.utils import test_method_b,-因此方法将保留在我的test.py的命名空间中
  • 通过 with 语句使用 mock.patch 作为上下文管理器。
  • 使用mock.patch作为装饰器。

问题是不应用上述解决方案是否可以解决问题?

如果可能的话,我需要继续使用 mock.patchimports

最佳答案

上述奇怪的行为是由于没有停止模拟 method_b 的修补程序而发生的。

请参阅下面的工作代码:

utils.py 文件与有问题的文件相同。

tests.py:

import mock
import unittest

import utils


class TestA(unittest.TestCase):

def setUp(self):
pass

def test_method_a(self):
method_b_patcher = mock.patch('utils.method_b', return_value=None)
method_b_patcher.start()
actual_result = utils.method_a()
method_b_patcher.stop()

def test_method_b(self):
actual_result = utils.method_b()
self.assertTrue(actual_result)

所以更新的是,在 test_method_a 中,我添加了 method_b_patcher 并调用 startstop test_method_a 方法中的修补程序。

关于python - 如何对方法应用@mock.patch并在一个或多个测试中保留对原始方法的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com