7

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

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

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

4

1 回答 1

15

不幸的是,您需要在此处自行检查。您可以通过它的属性从模拟中获取调用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确保只使用单个位置参数调用该函数一次,但随后我打开调用来查看该参数以检查它是否正确。

于 2015-02-09T19:51:58.733 回答