有没有办法用Pytest包测试特定对象类型是否作为参数传递到函数中?

2024-09-29 00:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Pytest测试一个类,我想验证(最好是通过.assert\u调用\u with())我希望传递到我正在检查的函数中的一个参数是特定的对象类型。我遇到的问题是.assert\u调用的\u with()似乎只能验证基元类型参数(字符串、int等)。对于那些熟悉.NET Mocking库MOQ的人,我想做如下工作:

mockedSomething.Verify(x=>;x、 mockedSomethingsFunction(It.IsAny())

这是针对我正在使用TDD设计的pythonweb应用程序。使用pythonversion3.7.1,pytest和pytest模拟包

一级测试:

class Foo():
def __init__(self, proxy, htmlBuilder):
        self._htmlBuilder = htmlBuilder
        self._proxy = proxy

def default(self):
    userData = self._proxy.get_the_data_object()
    return self._htmlBuilder.build_html(userData, True)  

测试功能:

import pytest

def test_this_is_the_test(mocker):
#assemble
user = User()
mocker.patch.object(Proxy, 'get_the_data_object')
Proxy.get_the_data_object.return_value = user
mocker.spy(HtmlBuilder, 'build_html')

#act
Foo.default()

#assert
assert HtmlBuilder.build_html.assert_called_with(user, True)

我希望我在修补程序(user)中返回的对象是发送到.build\u html(user arg1,Bool arg2)函数中的对象,我的assert将通过。但是测试失败了,这是pytest在我像在代码示例中那样断言时写出的输出(user,True):

E       AssertionError: assert None
E        +  where None = <bound method wrap_assert_called_with of <MagicMock name='build_html' id='140017474442688'>>(<Foo.Models.Foo.User object at 0x7f585bd39b00>, True)
E        +    where <bound method wrap_assert_called_with of <MagicMock name='build_html' id='140017474442688'>> = <MagicMock name='build_html' id='140017474442688'>.assert_called_with
E        +      where <MagicMock name='build_html' id='140017474442688'> = HtmlBuilder.build_html

当我省略如下用户参数时:

assert HtmlBuilder.build_html.assert_called_with(True)

然后我运行测试,测试失败了,但是这次pytest的输出暗示了我一开始的想法:

E       AssertionError: Expected call: build_html_for_default_route(True)
E       Actual call: build_htmle(<Foo.Models.Foo.User object at 0x7f20c0b0fc18>, True)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert (<Foo...0x7f20c0b0fc18>, True) == (True,)
E         At index 0 diff: <Foo.Models.Foo.User object at 0x7f20c0b0fc18> != True
E         Left contains more items, first extra item: True
E         Full diff:
E         - (<Foo.Models.Foo.User object at 0x7f20c0b0fc18>, True)
E         + (True,)


Tags: thebuildselftrueobjectfoopytesthtml