私は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_by
version_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
これで問題が解決することを願います!