在加载fixture时django单元测试出错

4 投票
3 回答
1750 浏览
提问于 2025-04-16 04:44

我正在为一个Django应用程序编写单元测试。为了测试,我需要一些数据库中的数据,所以我使用了一个json格式的数据文件。

我有两个数据文件:

  1. 一个是用户数据,运行得很好。
  2. 另一个是一些网页数据。

第二个数据文件出现了以下错误:

Problem installing fixture 'C:\Users\luc\Dev\Hg\mnl-adminpub\website\fixtures\website-unittest.json': Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\django\core\management\commands\loaddata.py", line 169, in handle
    obj.save(using=using)
  File "C:\Python26\lib\site-packages\django\core\serializers\base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "C:\Python26\lib\site-packages\django\db\models\base.py", line 528, in save_base
    result = manager._insert(values, return_id=update_pk, using=using)
  File "C:\Python26\lib\site-packages\django\db\models\manager.py", line 195, in _insert
    return insert_query(self.model, values, **kwargs)
  File "C:\Python26\lib\site-packages\django\db\models\query.py", line 1479, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 783, in execute_sql
    cursor = super(SQLInsertCompiler, self).execute_sql(None)
  File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 727, in execute_sql
    cursor.execute(sql, params)
  File "C:\Python26\lib\site-packages\django\db\backends\mysql\base.py", line 86, in execute
    return self.cursor.execute(query, args)
  File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 173, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python26\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
OperationalError: (1366, "Incorrect string value: '\\xE2\\x80\\xA8<br...' for column 'html' at row 1")

我用dumpdata创建了这个数据文件,并用loaddata测试过,运行得也不错。我使用的是mysql数据库。

你觉得可能是什么原因导致这个问题的呢?

谢谢你的帮助!

3 个回答

1

我也遇到过同样的问题。在MySql数据库中使用utfmb4,并在TEST字典中添加一个CHARSET键,这样就解决了问题(Django 1.11版本):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            ...
            'charset': 'utf8mb4',
        },
        'TEST': {'CHARSET': 'utf8mb4',},
    }
}
1

如果这个问题只在测试的时候出现,我会怀疑一些测试设置,比如 TEST_CHARSET。也许你的(正常使用的,不是测试用的)数据库有一些不是默认的字符集?如果是这样,你需要指定测试数据库应该使用哪个字符集。

顺便说一下,如果你使用的是旧版本(1.2之前的版本),那么应该使用 TEST_DATABASE_CHARSET 来设置。

9

你应该在数据库配置中使用 TEST_CHARSET,具体是这样做的:

DATABASES = {
      'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test_sbet',                      
        'USER': 'test_sbet',                      
        'TEST_CHARSET': 'UTF8',
    }
}

撰写回答