在TravisCI上测试文件上载时发生Django断言错误

2024-04-20 10:41:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,允许用户上传一个文件,并显示在页面上。我用一个方法创建了一个测试类,该方法检查上传的文件(存储在本地)是否与POST请求返回的文件相同。这个测试在本地工作,但是由于某种原因,当我在TravisCI上运行测试时,POST似乎没有返回文件,构建失败。你知道吗

我认为这个错误是因为我使用python模块whitenoise来管理生产中的静态文件。由于whitenoise将上传的文件存储在不同的地方,因此django.test.Client.post()可能不知道在哪里查找文件。在我安装whitenoise之前,测试是在TravisCI上进行的,所以看起来就是这样。你知道吗

如果我把白噪音包留在需求.txt要安装在TravisCI build server上的文件,会发生这种情况,但是当我尝试从该文件中删除包时,会出现以下错误,即使我从项目设置的本地版本中删除了whitenoise设置:

======================================================================
ERROR: test_uploaded_file (photoViewer.test_upload.FileUploadTestClass)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/travis/build/loremIpsum1771/test_ci/photoViewer/test_upload.py", line 16, in test_uploaded_file
    response = c.post('/', {'image': fp})
  File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/django/test/client.py", line 548, in post
    secure=secure, **extra)
  File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/django/test/client.py", line 350, in post
    secure=secure, **extra)
  File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/django/test/client.py", line 416, in generic
    return self.request(**r)
  File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/django/test/client.py", line 483, in request
    response = self.handler(environ)
  File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/django/test/client.py", line 131, in __call__
    self.load_middleware()
  File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/django/core/handlers/base.py", line 80, in load_middleware
    middleware = import_string(middleware_path)
  File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/django/utils/module_loading.py", line 20, in import_string
    module = import_module(module_path)
  File "/opt/python/2.7.14/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named whitenoise.middleware

为什么Django还在寻找没有安装的whitenoise模块?在本地(在构建服务器上)运行时如何禁用它,以便测试方法中的post请求实际返回文件?

测试类:

from __future__ import unicode_literals
import os
from django.test import  Client
import unittest

MYDIR = os.path.dirname(__file__)

class FileUploadTestClass(unittest.TestCase):

    def test_uploaded_file(self):
        c = Client()
        originalFilePath = os.path.join(MYDIR, '../live-static/static-root/Keep-Calm-and-Carry-On.jpg')
        with open(originalFilePath, "rb") as fp:
            response = c.post('/', {'image': fp})
            fp.seek(0)
            self.assertEqual( fp.read(),response.content)

本地设置文件

DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "photoViewer",
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]



TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]




# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'


STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
 #   '/var/www/static/',
]

STATIC_ROOT = os.path.join(BASE_DIR,"live-static","static-root")




MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR,"live-static","media-root")


CORS_REPLACE_HTTPS_REFERER = False
HOST_SCHEME = "http://"
SECURE_PROXY_SSL_HEADER =None
SECURE_SSL_REDIRECT = False
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False
SECURE_HSTS_SECONDS = None
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
SECURE_FRAME_DENY = False

Tags: 文件pathdjangoinpytestimporttravis