Python:模拟导入的模块方法

时间:2017-09-16 19:30:55

标签: python unit-testing mocking tdd

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

1 个答案:

答案 0 :(得分:0)

您正在寻找unittest.mock.patch。在测试期间,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)