用python编写一些单元测试,并使用MagicMock模拟出一个接受JSON字符串作为输入的方法。在我的单元测试中,我想Assert它是用给定的参数调用的,但是我遇到了assert语句的问题,因为除了字符串的assert语句之外,对象在dict中的顺序并不重要。下面是我试图实现的简化示例。
mock_funct = MagicMock()
# mocked function called elsewhere
expected = {"a":"a", "b":"b"}
mock_funct.assert_called_once_with(json.dumps(expected))
上面的可能通过,也可能失败,因为当dict转储到json时,dict中的键的顺序是任意的,即'{"a":"a", "b":"b"}'
和'{"b":"b", "a":"a"}'
都是有效的转储,但是一个会失败,一个会通过,但是我想写测试,以便任何一个都会通过。
2条答案
按热度按时间yxyvkwin1#
不幸的是,你需要在这里做你自己的检查。您可以通过mock的
call_args_list
属性(或者,在本例中仅使用call_args
,因为您已经Assert它只被调用一次)从mock获取调用。我假设您在我的示例代码中使用的是unittest
--但是它应该很容易适应任何测试框架……我仍然使用
assert_called_once_with
来确保该函数只使用一个位置参数调用一次,但随后我打开该调用来查看该参数以检查它是否正确。wbgh16ku2#
unittest的
assert_called_once_with
将对调用中的每个参数执行相等性检查。Python有一个dunder方法来控制如何执行相等性检查:
__eq__
知道了这一点,我们可以创建一个 Package 类来帮助我们: