python 使用模拟补丁装饰器两次,autospec=True

i5desfxk  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(108)

如何使用补丁装饰器创建两个不同的模拟对象?
我有一个测试需要两个模拟的selenium WebElements。我可以只使用两个补丁装饰器:

@mock.patch("selenium.webdriver.remote.webelement.WebElement")
@mock.patch("selenium.webdriver.remote.webelement.WebElement")
def test_does_not_match_unclickable_element(
    self, invisible_element, inactive_element
):

但在本例中,我希望确保已修补的对象被指定出来,以便任何试图调用不存在的方法的代码都将正确地失败。

@mock.patch("selenium.webdriver.remote.webelement.WebElement", autospec=True)
@mock.patch("selenium.webdriver.remote.webelement.WebElement", autospec=True)
def test_does_not_match_unclickable_element(
    self, invisible_element, inactive_element
):
    invisible_element.is_displayed.return_value = False
    invisible_element.is_enabled.return_value = True
    inactive_element.is_displayed.return_value = True
    inactive_element.is_enabled.return_value = False

将引发以下异常:
unittest.mock.InvalidSpecError: Cannot autospec attr 'WebElement' from target 'selenium.webdriver.remote.webelement' as it has already been mocked out. [target=<module 'selenium.webdriver.remote.webelement' from '/python3.10/site-packages/selenium/webdriver/remote/webelement.py'>, attr=<MagicMock name='WebElement' spec='WebElement' id='4501588480'>]

如何将修补程序模拟对象的两个副本传递给测试?
**编辑:**我可以直接使用spec参数,它具有类似的结果(并且最终会解决问题),但是......

# This works
@mock.patch("selenium.webdriver.remote.webelement.WebElement", spec=WebElement)
@mock.patch("selenium.webdriver.remote.webelement.WebElement", spec=WebElement)
def test_does_not_match_unclickable_element(
    self, invisible_element, inactive_element
):

我想知道如何利用autospec参数解决这个问题。

ecfsfe2w

ecfsfe2w1#

现在可能有点晚了,但是对于任何其他面临这个问题的人,我使用unittest.mock.createautospec并将示例参数设置为True。
这将返回被调用类的示例,因此在上面的示例中,每个Webelement都是不同的对象,其所有属性都被正确地模拟出来。
https://docs.python.org/3/library/unittest.mock.html#create-autospec

相关问题