Pythonでモックオブジェクトのメソッドをモックしますか?質問する

Pythonでモックオブジェクトのメソッドをモックしますか?質問する

私はPython 3.4で書かれたプロジェクトの単体テストをunittest.mockライブラリを使って書いています。テストしている関数には関数の呼び出しが含まれています。

versions = get_all_versions(some_argument)

MagicMockこれをリストを返すオブジェクトでパッチ適用したので、versionバージョン番号のリストになり、すべて正常に動作します。

今、私がテストしているコードは少し変更され、次のようになっています

versions = get_all_versions(some_argument).order_by(another_argument)

今、私はorder_by同じバージョン番号のリストを返すメソッドが必要ですが、get_all_versionsモックのままにしておく必要がありますが、これを実現するにはいくつか問題があります。

私はパッチを当ててみました

get_all_versions = MagicMock()
get_all_versions.order_by = version_list

しかし、それはうまくいきません。それはorder_byメソッドであってプロパティではないからだと思います。私はまた試しました

get_all_versions = MagicMock()
get_all_versions.order_by = MagicMock(return_value=version_list)

そして(もっと必死に)

get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))

しかし、どちらも機能しません。

オブジェクトを返す関数をモックし、そのオブジェクトのメソッドをモックしてリストを返すようにするにはどうすればよいですか?

ベストアンサー1

必要なのは、以下を返すget_all_versionsメソッドを持つオブジェクトを返すことです。order_byversion_list

get_all_versions = MagicMock()
get_all_versions.return_value.order_by.return_value = version_list

試行がうまくいかなかった理由を説明すると、最初の試行では、メソッドをorder_by値に置き換えますversion_list

get_all_versions = MagicMock()
get_all_versions.order_by = version_list

結果はおおよそ次のようになります。

get_all_versions.order_by == version_list

2 番目の試みでは、 の戻り値をget_all_versions関数のようなものに置き換えて を返しますversion_list

get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))

結果は次のようになります:

get_all_versions(some_argument)(another_argument) == version_list

これで問題が解決することを願います!

おすすめ記事