2015-02-09 16 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查看該參數以檢查它是否正確。

相關問題