Python:模拟导入模块方法

2023-12-22

我必须测试方法 pyautogui.click() 是否被调用。这是我的 Player.py 文件:

# Player.py

import pyautogui

class Player:
    def play():
        pyautogui.click(100, 100)

这是我的测试文件:

# Test_Player.py

import unittest
from Player import Player

class Test_Player(unittest.TestCase):
    def test_play(self):
        player = Player()
        player.play()
        # assert pyautogui.click is called once

我尝试过pyautogui.click = MagicMock()还有许多其他事情,但我真的找不到如何断言 pyautogui.click() 被调用一次。


您正在寻找单元测试.mock.补丁 https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch。补丁在测试期间用模拟版本替换导入的模块。最重要的是要理解它,你必须修补一些东西进口地,而不是它居住的地方。这意味着你打补丁Player.pyautogui, not pyautogui本身。你应该阅读《在哪里打补丁》 https://docs.python.org/3/library/unittest.mock.html#id5在文档中。

您可以将补丁装饰器添加到您的测试函数中,并将您想要用模拟替换的内容传递给它。您传递给它的字符串应该是运行测试的相对路径(通常是项目的根目录)。我假设您的两个文件都位于同一文件夹中,并且您从该文件夹运行测试。

然后,补丁装饰器将向您的测试函数传递一个 MagicMock 实例作为参数self。您可以随意命名它。我会称之为mock_pyautogui在下面的示例中。在函数内部,您可以像平常一样做出断言。

import unittest
from Player import Player

class Test_Player(unittest.TestCase):

    @unittest.mock.patch("Player.pyautogui")
    def test_play(self, mock_pyautogui):
        player = Player()
        player.play()

        self.assertEqual(1, mock_pyautogui.click.call_count)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:模拟导入模块方法 的相关文章

随机推荐