11

我对使用 django-pipeline 的应用程序的单元测试视图有问题?每当我在任何 URL 上执行 client.get() 时,都会产生以下异常:

ValueError:在 <pipeline.storage.PipelineCachedStorage 对象位于 0x10d544950> 处找不到文件“css/bootstrap.css”。

它是 bootstrap.css 的事实当然并不重要,但是由于这个异常,我无法执行视图渲染。

欢迎任何指南/提示!

4

6 回答 6

9

我遇到了类似的问题。但是,设置

STATICFILES_STORAGE='pipeline.storage.NonPackagingPipelineStorage'

运行测试时仅部分解决了我的问题。如果您想运行 LiverServerTestCase 测试而不必在运行测试之前调用“collecstatic”,我还必须完全禁用管道:

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 等)使用测试工具使用它的测试,因此需要同时发布静态资产。

我没有对此进行测试,但听起来很有希望。现在我正在使用自定义测试运行器在他的解决方案中执行@jrothenbuhler 的操作,这不需要您运行 collectstatic。如果您真的非常希望它运行 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 的需要。请注意,它是管道的 DEBUG 设置,而不是 Django 的设置,它在此处被覆盖。这样做的原因是您希望 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')

现在我所有需要渲染包含压缩css标签的UI的测试都使用UITestCase而不是django.test.TestCase。

于 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

同样在这里。指这个问题:https ://github.com/cyberdelia/django-pipeline/issues/277

当我使用 py.test 时,我将其放入 conftest.py 作为解决方法:

import pytest
from django.conf import settings

def pytest_configure():
    # workaround to avoid django pipeline issue
    # refers to 
    settings.STATICFILES_STORAGE = 'pipeline.storage.PipelineStorage'
于 2014-03-18T16:02:59.053 回答
0

我已经尝试过@jrothenbuhler 解决方法,起初它会有所帮助.. 但是,由于某种原因,经过数小时的调试,它再次开始失败并出现相同的错误,我发现唯一有帮助的是设置

STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage'

直接在设置中......不知道为什么,但它有效。

于 2019-10-07T13:37:24.153 回答