Python:模拟导入模块方法

Gio*_*ota 3 python tdd unit-testing mocking

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

# Player.py

import pyautogui

class Player:
    def play():
        pyautogui.click(100, 100)
Run Code Online (Sandbox Code Playgroud)

这是我的测试文件:

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

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

lor*_*mer 5

您正在寻找unittest.mock.patch。补丁在测试期间用模拟版本替换导入的模块。要理解它的最重要的一点是,您必须在导入的地方修补某些内容,而不是在它所在的地方。这意味着您要修补Player.pyautogui,而不是pyautogui修补本身。您应该阅读“在哪里打补丁”文档中的

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

然后,补丁装饰器将向您的测试函数传递一个 MagicMock 实例作为 after 的参数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)
Run Code Online (Sandbox Code Playgroud)