11

django-pipeline を使用するアプリケーションのビューの単体テストに問題がありますか? 任意の URL で client.get() を実行すると、次の例外が発生します。

ValueError: ファイル 'css/bootstrap.css' が <pipeline.storage.PipelineCachedStorage object at 0x10d544950> で見つかりませんでした。

もちろん、bootstrap.css であるという事実は重要ではありませんが、この例外のためにビューのレンダリングを実行できません。

ガイド/ヒントは大歓迎です!

4

6 に答える 6

9

同様の問題に遭遇しました。ただし、設定

STATICFILES_STORAGE='pipeline.storage.NonPackagingPipelineStorage'

テストを実行すると、問題が部分的にしか解決しませんでした。また、テストを実行する前に「collecstatic」を呼び出さずに LiverServerTestCase テストを実行する場合は、パイプラインを完全に無効にする必要がありました。

PIPELINE_ENABLED=False

django 1.4 以降、テストの設定を変更するのは非常に簡単です。メソッドまたは TestCase クラスに対して機能する便利なデコレータがあります。

https://docs.djangoproject.com/en/1.6/topics/testing/tools/#overriding-settings

例えば

from django.test.utils import override_settings

@override_settings(STATICFILES_STORAGE='pipeline.storage.NonPackagingPipelineStorage', PIPELINE_ENABLED=False)
class BaseTestCase(LiveServerTestCase):
    """
    A base test case for Selenium
    """

    def setUp(self):
        ...

ただし、@jrothenbuhlerが彼の回答で説明しているように、これは一貫性のない結果をもたらしました。とにかく、統合テストを実行している場合、これは理想的とは言えません。潜在的な問題を検出するために、可能な限り本番環境を模倣する必要があります。django 1.7には、新しいテストケース「StaticLiveServerTestCase」の形でこれに対する解決策があるようです。ドキュメントから: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#django.contrib.staticfiles.testing.StaticLiveServerCase

この unittest TestCase サブクラスは、django.test.LiveServerTestCase を拡張します。

親と同じように、テスト対象のコードを実行し、HTTP (Selenium、PhantomJS など) を介してテスト ツールで使用することを含むテストを作成するために使用できます。そのため、静的アセットも公開する必要があります。

私はこれをテストしていませんが、有望に思えます。今のところ、collectstatic を実行する必要のないカスタム テスト ランナーを使用して、彼のソリューションで @jrothenbuhler が行っていることを行っています。本当に、本当に collectstatic を実行したい場合は、次のようにすることができます。

from django.conf import settings
from django.test.simple import DjangoTestSuiteRunner
from django.core.management import call_command

class CustomTestRunner(DjangoTestSuiteRunner):
    """
    Custom test runner to get around pipeline and static file issues
    """

    def setup_test_environment(self):
        super(CustomTestRunner, self).setup_test_environment()
        settings.STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage'
        call_command('collectstatic', interactive=False)

settings.py で

TEST_RUNNER = 'path.to.CustomTestRunner'
于 2014-02-27T04:19:34.693 に答える
4

私は同じ問題に遭遇しました。カスタムテストランナーを使用して取り組みました:

from django.conf import settings
from django.test.simple import DjangoTestSuiteRunner

from pipeline.conf import settings as pipeline_settings

class PipelineOverrideRunner(DjangoTestSuiteRunner):

    def setup_test_environment(self):
        '''Override STATICFILES_STORAGE and pipeline DEBUG.'''
        super(PipelineOverrideRunner, self).setup_test_environment()
        settings.STATICFILES_STORAGE = 'pipeline.storage.PipelineFinderStorage'
        pipeline_settings.DEBUG = True

次に、settings.py で:

TEST_RUNNER = 'path.to.PipelineOverrideRunner'

パイプラインの DEBUG 設定を True に設定すると、静的ファイルがパッケージ化されなくなります。これにより、テストを実行する前に collectstatic を実行する必要がなくなります。ここでオーバーライドされるのは、Django の設定ではなく、パイプラインの DEBUG 設定であることに注意してください。これは、本番環境を最適にシミュレートするためにテストするときに、Django の DEBUG を False にする必要があるためです。

STATICFILES_STORAGE を PipelineFinderStorage に設定すると、テストの実行時と同様に、Django の DEBUG 設定が False に設定されている場合に静的ファイルが検出されるようになります。

カスタム TestCase ではなくカスタム テスト ランナーでこれらの設定をオーバーライドすることにした理由は、django.contrib.staticfiles.storage.staticfiles_storage オブジェクトなどの特定のものが、これらの設定やその他の設定に基づいて一度設定されるためです。カスタム TestCase を使用しているときに、django.contrib.staticfiles.storage などのモジュールがロードされたときにオーバーライドが有効になっているかどうかに応じて、テストの成功と失敗に一貫性がなくなるという問題に遭遇していました。

于 2013-05-23T17:11:26.060 に答える
1

私は同じ問題に遭遇しました。STATIC_FILES_STORAGEテスト中に別の方法を使用して、なんとか回避できました。

STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage'

本番用とテスト用に別々の設定ファイルを持っているので、テスト版に入れただけですが、そうでない場合は、if DEBUG.

- 編集

これは単体テスト中にしか表示されないため、もう少し手間がかかりました。これに対処するために、http://djangosnippets.org/snippets/1011/ のスニペットを使用して UITestCase クラスを作成しました。

class UITestCase(SettingsTestCase):
    '''
    UITestCase handles setting the Pipeline settings correctly.
    '''
    def __init__(self, *args, **kwargs):
        super(UITestCase, self).__init__(*args, **kwargs)

    def setUp(self):
        self.settings_manager.set(
            STATICFILES_STORAGE='pipeline.storage.NonPackagingPipelineStorage')

これで、compressed_css タグを含む UI をレンダリングする必要があるすべてのテストで、django.test.TestCase の代わりに UITestCase が使用されます。

于 2013-03-22T18:00:19.493 に答える
1

私は同じ問題に遭遇しました。

TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner'

方法はわかりませんが、何らかの形でパイプラインとやり取りしたに違いありません。その設定を削除すると、問題はなくなりました。

テスト中に Celery を強制的に熱心にする必要があったので、それoverride_settingsを必要とするテストに使用しました。

from django.test.utils import override_settings

…

class RegisterTestCase(TestCase):

    @override_settings(CELERY_EAGER_PROPAGATES_EXCEPTIONS=True,
                       CELERY_ALWAYS_EAGER=True,
                       BROKER_BACKEND='memory')
    def test_new(self):
        …
于 2013-06-07T07:39:46.770 に答える
0

私は@jrothenbuhlerの回避策を試しましたが、最初は役に立ちました..しかし、何らかの理由で、何時間ものデバッグの後、同じエラーで再び失敗し始めます。

STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage'

設定で直接...理由はわかりませんが、機能します。

于 2019-10-07T13:37:24.153 に答える