【问题标题】:Python: mock imported module methodPython:模拟导入模块方法
【发布时间】:2017-09-16 19:30:54
【问题描述】:

我必须测试是否调用了 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() 被调用一次。

【问题讨论】:

标签: python unit-testing mocking tdd


【解决方案1】:

您正在寻找unittest.mock.patch。补丁在测试期间用模拟版本替换导入的模块。了解它最重要的一点是,您必须修补某些东西导入的位置,而不是它所在的位置。这意味着您修补Player.pyautogui,而不是pyautogui 本身。您应该阅读文档中的"Where to Patch"

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

补丁装饰器随后会将 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多