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

时间:2015-02-09 19:34:09

标签: python json magicmock

在python中编写一些单元测试,并使用MagicMock模拟一个接受JSON字符串作为输入的方法。在我的单元测试中,我想声明它是用给定的参数调用的,但是我遇到了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时的任意排序,上面可能会通过或者可能会失败,即'{"a":"a", "b":"b"}''{"b":"b", "a":"a"}'都是有效的转储,但是一个会失败,一个会通过,但是我想写测试,以便其中任何一个通过。

1 个答案:

答案 0 :(得分:11)

不幸的是,你需要在这里做自己的检查。您可以通过它的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查看该参数以检查它是否正确。