Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mock:assert Mock_调用使用numpy数组作为参数引发ValueError,而np.testing.assert_数组_equal不起作用_Python_Unit Testing_Numpy_Mocking - Fatal编程技术网

Python Mock:assert Mock_调用使用numpy数组作为参数引发ValueError,而np.testing.assert_数组_equal不起作用

Python Mock:assert Mock_调用使用numpy数组作为参数引发ValueError,而np.testing.assert_数组_equal不起作用,python,unit-testing,numpy,mocking,Python,Unit Testing,Numpy,Mocking,我有一个mock对象,我想使用mock_调用检查它的调用,其中它是用numpy数组调用的。但问题是它会引发ValueError,如下面的简单玩具示例所示 >>> mocked_model_called_with_np_array = mock.Mock() >>> mocked_model_called_with_np_array(np.array([1, 2])) >>> mocked_model_called_with_np_array.

我有一个mock对象,我想使用mock_调用检查它的调用,其中它是用numpy数组调用的。但问题是它会引发ValueError,如下面的简单玩具示例所示

>>> mocked_model_called_with_np_array = mock.Mock()
>>> mocked_model_called_with_np_array(np.array([1, 2]))
>>> mocked_model_called_with_np_array.mock_calls
[call(array([1, 2]))]
现在我设置了预期的调用:

>>> expected_call_with_numpy = [mock.call(np.array([1, 2]))]
现在,如果我按如下所示进行检查,则会引发错误:

>>> assert expected_call_with_numpy == mocked_model_called_with_np_array.mock_calls

---------------------------------------------------------------------------
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-61-9806e62badf5> in <module>
----> 1 assert expected_call_with_numpy == mocked_model_called_with_np_array.mock_calls

c:\..\python\python36\lib\unittest\mock.py in __eq__(self, other)
   2053 
   2054         # this order is important for ANY to work!
-> 2055         return (other_args, other_kwargs) == (self_args, self_kwargs)
   2056 
   2057 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
请注意,数组是相同的,但会产生错误

有人能评论一下如何对使用numpy数组调用的mockec对象使用mock_调用,然后检查mock_调用是否产生预期的调用吗?e、 g.,类似于下面的内容

assert expected_call_with_numpy == mocked_model_called_with_np_array.mock_calls

只需创建一个假(模拟)类,就可以跟踪传递给类的任何方法的numpy参数。例如,如果我想检查类
Foo
的对象对方法
bar
的numpy调用,我可以执行以下操作:

class MockFoo():
    called_by = []
    def bar(self, *args):
        self.called_by.extend([*args])
现在,我们有:

>>> a = MockFoo()
>>> a.bar(numpy.array([1, 2]))
>>> a.bar(numpy.array([100, 200]))
>>> a.bar(numpy.array([10000, 20000]))
现在,我们只需检查对
foo.bar
的调用,如下所示:

>>> a.called_by 
[array([1, 2]), array([100, 200]), array([10000, 20000])]

尝试检查模拟调用是否包含特定的numpy数组时遇到了相同的问题。 事实证明,调用对象是可索引的,因此您也可以执行以下操作:

>>> import numpy as np
>>> from unittest import mock
>>> mock_object = mock.MagicMock()
>>> mock_object(1, np.array([1, 2, 3]), a=3)
>>> mock_object(10, np.array([10, 20, 30]), b=30)
>>> calls = mock_object.call_args_list
>>> calls
[call(1, array([1, 2, 3]), a=3), call(10, array([10, 20, 30]), b=30)]
>>> calls[0]
call(1, array([1, 2, 3]), a=3)
>>> calls[0][0]
(1, array([1, 2, 3]))
>>> calls[0][1]
{'a': 3}
因此,不必断言调用是相等的,您只需检查调用是否已发出,以及传递的参数是否正确,但它可以工作:

>>> assert mock_object.call_count == 2
>>> assert calls[0][0][0] == 1
>>> np.testing.assert_array_equal(calls[0][0][1], np.array([1, 2, 3]))
>>> assert calls[0][1]['a'] == 3
...
>>> assert mock_object.call_count == 2
>>> assert calls[0][0][0] == 1
>>> np.testing.assert_array_equal(calls[0][0][1], np.array([1, 2, 3]))
>>> assert calls[0][1]['a'] == 3
...