2017-09-16 87 views
0

我必须测试是否调用方法pyautogui.click()。这是我的Player.py文件:Python:模拟输入模块方法

# 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

我建议你[阅读文档](https://docs.python.org/3/library/unittest.mock.html)。至少给[mcve]。 – jonrsharpe

回答

0

您正在寻找unittest.mock.patch。修补程序会在测试期间用模拟版本替换导入的模块。要了解它最重要的是,你必须补丁,它在哪里进口,而不是它住的地方。这意味着你补丁Player.pyautogui,而不是pyautogui本身。您应该在文档中阅读"Where to Patch"

您可以将修补程序修饰器添加到您的测试功能中,并将其替换为您想要替换的模型。您传递的字符串应该是您运行测试的相对路径(通常是项目的根目录)。我假设你的两个文件都在同一个文件夹中,然后从该文件夹运行测试。

然后,修补程序修饰器将在self之后将您的测试功能作为参数传递给MagicMock的一个实例。你可以随便命名。我将在下面的示例中将其称为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)