如何使用补丁装饰器创建两个不同的模拟对象?
我有一个测试需要两个模拟的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
参数解决这个问题。
1条答案
按热度按时间ecfsfe2w1#
现在可能有点晚了,但是对于任何其他面临这个问题的人,我使用unittest.mock.createautospec并将示例参数设置为True。
这将返回被调用类的示例,因此在上面的示例中,每个Webelement都是不同的对象,其所有属性都被正确地模拟出来。
https://docs.python.org/3/library/unittest.mock.html#create-autospec