断言使用 python 中的 json 字符串调用的模拟函数

Assert mocked function called with json string in python

在 python 中编写一些单元测试并使用 MagicMock 模拟一个接受 JSON 字符串作为输入的方法。在我的单元测试中,我想断言它是用给定的参数调用的,但是我 运行 遇到了 assert 语句的问题,因为 dict 中对象的顺序并不重要,除了在 assert 语句中字符串。下面是我要实现的目标的简化示例。

mock_funct = MagicMock()
# mocked function called elsewhere
expected = {"a":"a", "b":"b"}
mock_funct.assert_called_once_with(json.dumps(expected))

由于转储到 json 时 dict 中键的任意顺序,上述可能通过也可能失败,即 '{"a":"a", "b":"b"}''{"b":"b", "a":"a"}' 都是有效转储但是一个会失败,一个会通过,但是我想编写测试,以便其中一个都能通过。

很遗憾,您需要在此处自行检查。您可以通过它的 call_args_list 属性从模拟中获取调用(或者,在这种情况下只是 call_args 因为您已经断言它只被调用一次)。我假设您在我的示例代码中使用了 unittest——但它应该很容易适应任何测试框架...

mock_funct.assert_called_once_with(mock.ANY)
call = mock_funct.call_args
call_args, call_kwargs = call  # calls are 2-tuples of (positional_args, keyword_args)
self.assertEqual(json.loads(call_args[0]), expected)

我仍然使用 assert_called_once_with 来确保该函数仅使用一个位置参数调用一次,但随后 I open up the call 查看该参数以检查它是否正确。