2015-02-09 55 views
4

在python中编写一些单元测试,并使用MagicMock来模拟接受JSON字符串作为输入的方法。在我的单元测试中,我想断言它是用给定的参数调用的,但是我遇到了assert语句的问题,因为字典中对象的排序并不重要,除了字符串的assert语句之外。下面我试图实现的简化示例。在python中声明使用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"}'是有效的转储但却一个会失败和一个将通过,我想写测试,以便通过。

回答

9

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