Django单元测试中的Unicode

Posted

技术标签:

【中文标题】Django单元测试中的Unicode【英文标题】:Unicode in Django unit test 【发布时间】:2011-12-04 08:46:57 【问题描述】:

我尝试在 Django 单元测试中使用 utf8 字符串并包含

# -*- coding: utf-8 -*-

但是 django-admin.py 仍然抱怨没有编码。

Traceback(最近一次调用最后一次):

文件“/home/basti/work/virtualenv/bin/django-admin.py”,第 5 行,在 management.execute_from_command_line()

文件 "/home/basti/work/virtualenv/lib/python2.7/site-packages/django/core/management/init.py", 第 429 行,在 execute_from_command_line 实用程序.execute()

文件 "/home/basti/work/virtualenv/lib/python2.7/site-packages/django/core/management/init.py", 第 379 行,执行中 self.fetch_command(subcommand).run_from_argv(self.argv)

文件 "> /home/basti/work/virtualenv/lib/python2.7/site-packages/django/core/management/base.py", 第 191 行,在 run_from_argv self.execute(*args, **options.dict)

文件 “/home/basti/work/virtualenv/lib/python2.7/site-packages/django/core/management/base.py”, 第 220 行,在执行中 输出 = self.handle(*args, **options)

文件 “/home/basti/work/virtualenv/lib/python2.7/site-packages/south/management/commands/test.py”, 第 8 行,在句柄中 super(Command, self).handle(*args, **kwargs)

文件 “/home/basti/work/virtualenv/lib/python2.7/site-packages/django/core/management/commands/test.py”, 第 37 行,在句柄中 失败 = test_runner.run_tests(test_labels)

文件 “/home/basti/work/virtualenv/lib/python2.7/site-packages/django/test/simple.py”, 第 358 行,在 run_tests 套件 = self.build_suite(test_labels, extra_tests)

文件 “/home/basti/work/virtualenv/lib/python2.7/site-packages/django/test/simple.py”, 第 248 行,在 build_suite 中 suite.addTest(build_suite(app))

文件 “/home/basti/work/virtualenv/lib/python2.7/site-packages/django/test/simple.py”, 第 77 行,在 build_suite 中 test_module = get_tests(app_module)

文件 “/home/basti/work/virtualenv/lib/python2.7/site-packages/django/test/simple.py”, 第 35 行,在 get_tests 中 test_module = import('.'.join(app_path + [TEST_MODULE]), , , TEST_MODULE)

SyntaxError: 第 242 行的文件 tests.py 中的非 ASCII 字符“\xc3”, 但没有声明编码;见http://www.python.org/peps/pep-0263.html 了解详情

代码是

# -- 编码:utf-8 --

"""                                                                                                                                                                                                         
This file demonstrates writing tests using the unittest module. These will pass                                                                                                                             
when you run "manage.py test".                                                                                                                                                                              

Replace this with more appropriate tests for your application.                                                                                                                                              
"""

from django.test import TestCase, Client
from django.contrib.auth.models import User
from django.db.utils import IntegrityError
from django.core.urlresolvers import reverse
from django.utils.encoding import smart_unicode

class ViewTests(TestCase):
    def setUp(self):
    self.client = Client()

   def test_french(self):
    self.client.cookies["django_language"] = 'fr'
    r = self.client.get("/")
    self.assertTrue(smart_unicode(u"Se déconnecter") in r.content)

我尝试将 TEST_CHARSET 和 TEST_DATABASE_CHARSET 设置为 utf8,但仍然没有成功。

关于如何解决这个问题的任何提示?

TIA && 祝你有美好的一天!

巴斯蒂

【问题讨论】:

你不想显示第 242 个字符串吗? 【参考方案1】:

我遇到了这个问题,因为在我的 models.py 中没有为文件设置编码。将 # -*- coding: utf-8 -*- 放入我的 models.py 并在我的测试文件中添加相同的内容解决了这个问题。

【讨论】:

【参考方案2】:

要回答我自己的问题,问题不在于匹配字符串,而在于请求内容的编码! 更改测试如下修复它

self.assertTrue(u"Se déconnecter" in r.content.decode('utf8'))

【讨论】:

【参考方案3】:

确保您在 each 文件中定义了编码,包括模型,当然还有 test.py。如果可能,获取最新版本的 django。

如果管理员还是不行,试试:

解决方案 #1:

from django.utils.encoding import smart_unicode

关于模型定义:

def __unicode__(self):  
    return smart_unicode(("%s" % self.field))

解决方案 #2:文字方法

def __unicode__(self):   
    return (u"%s" % self.field)  

始终设置

DEFAULT_CHARSET='utf-8'  

在 settings.py 中

您也可以翻译[这篇文章][1] [1]:http://www.pvilas.com/2011/03/django-evitar-error-en-el-administrador.html 来自西班牙语。希望能帮到你。

【讨论】:

我尝试使用 smart_unicode 并将 DEFAULT_CHARSET 设置为 utf-8 但错误仍然存​​在【参考方案4】:

放:

# -*- coding: utf-8 -*-

作为该文件的第一行。

【讨论】:

如果我将评论放在第一行(而不是在文档字符串之后),我会得到以下回溯 回溯(最近一次调用最后):文件“tests.py”,第 242 行,在 test_something self.assertTrue(u"Se déconnecter" in r.content) UnicodeDecodeError: 'ascii' codec can' t 解码位置 1196 中的字节 0xc3:序数不在范围内(128) @BastianBallmann 您应该显示该测试的代码(更新您的问题)。

以上是关于Django单元测试中的Unicode的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过 Django 中的单元测试?

python Django:单元测试中的ImageField

python 模拟Django在单元测试中的缓存

如何对 django 消息进行单元测试?

为视图编写 Django 单元测试 [重复]

如何在 Django REST Framework 中的单元测试期间登录用户?