7

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"}'が有効なダンプですが、一方は失敗し、もう一方は合格します。どちらかが通過します。

4

1 に答える 1

15

残念ながら、ここで独自のチェックを行う必要があります。モックからそのcall_args_list属性を介して呼び出しを取得できます (または、call_argsこの場合は、1 回だけ呼び出されることを既にアサートしているため)。サンプルコードで使用していると仮定しますが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 に答える