3

Seleniumを使用して、アプリケーションのフロントエンド動作のテストを作成しようとしています。ただし、テストしようとしているページはSolrからデータを取得しているため、テストを実行するためにSolrインスタンスを起動したくありません。

テストでpy.testとpy.test-djangoを使用しており、Seleniumブラウザーによって送信されたデータについてアサーションを作成するために、ビューにモンキーパッチを適用しようとしています。

たとえば、これは私が失敗すると予想するテストです。

def test_search(self, live_server, browser, monkeypatch):
    def mockview(request):
        from django.http import HttpResponse
        assert True == False
        return HttpResponse('Test')

    monkeypatch.setattr(project.app.views, 'search', mockview)

    browser.get(live_server.url + reverse('app:search'))

ブラウザが「app:search」ページを読み込もうとすると、これは失敗すると思います。代わりに、通常のバージョンのページが読み込まれ、テストが成功します。

この動作を取得する方法はありますか?または、これらのテストにアプローチするためのより良い方法はありますか?

4

1 に答える 1

5

ビューモジュールのビュー関数にモンキーパッチを適用しています。そのビュー(関数への参照)を既にインポートしている場所は、古い(実際の)ビュー関数への参照を保持します。

Djangoのurlconfメカニズムは、最初のリクエストで実際のビューをインポートして構成します(これはおそらく別のテストケースで発生します)。

ビューモジュールで関数を変更しても、urlconfは古いビュー関数への参照をすでに保持しているため、その関数に気付くことはありません。Pythonでのモンキーパッチは、関数自体ではなく、名前/参照を変更します。

pytestのモンキーパッチヘルパーを使用していますが、モックライブラリのドキュメントにあるこのガイドには、モンキーパッチを適用する場所に関するいくつかの優れた情報が記載されています。

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

この特定のケースでは、ビューではなく、静的テストデータでSorl呼び出しにパッチを適用するのが最善の策だと思います。あなたはSeleniumテストを行っているので、実際のビューを維持することは非常に良いことだと思います。ビュー全体を置き換える場合、実際に何をテストしていますか?

ビュー自体にSorl固有のコードが多数含まれている場合は、そのコードを別の関数に分割して、簡単にパッチを適用することができます。

本当にビューを変更したい場合は、urlconfをオーバーライドして、新しいビューを指すようにすることをお勧めします: https ://pytest-django.readthedocs.org/en/latest/helpers.html#pytest-mark-urls-override- the-urlconf

于 2013-03-04T13:14:55.333 に答える