我对使用 django-pipeline 的应用程序的单元测试视图有问题?每当我在任何 URL 上执行 client.get() 时,都会产生以下异常:
ValueError:在 <pipeline.storage.PipelineCachedStorage 对象位于 0x10d544950> 处找不到文件“css/bootstrap.css”。
它是 bootstrap.css 的事实当然并不重要,但是由于这个异常,我无法执行视图渲染。
欢迎任何指南/提示!
我对使用 django-pipeline 的应用程序的单元测试视图有问题?每当我在任何 URL 上执行 client.get() 时,都会产生以下异常:
ValueError:在 <pipeline.storage.PipelineCachedStorage 对象位于 0x10d544950> 处找不到文件“css/bootstrap.css”。
它是 bootstrap.css 的事实当然并不重要,但是由于这个异常,我无法执行视图渲染。
欢迎任何指南/提示!
我遇到了类似的问题。但是,设置
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'
我一直遇到同样的问题。我使用自定义测试运行器解决了它:
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 等模块时覆盖是否生效。
我遇到了同样的问题。我在测试时设法通过使用不同的方法来解决它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。
我遇到了同样的问题,原来是因为我有
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):
…
同样在这里。指这个问题: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'
我已经尝试过@jrothenbuhler 解决方法,起初它会有所帮助.. 但是,由于某种原因,经过数小时的调试,它再次开始失败并出现相同的错误,我发现唯一有帮助的是设置
STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage'
直接在设置中......不知道为什么,但它有效。