Python Django在具有update()的模型上模拟存储时抛出错误

Python Django在具有update()的模型上模拟存储时抛出错误,python,django,testing,mocking,python-2.x,Python,Django,Testing,Mocking,Python 2.x,我有一个小项目,我正在做一些测试。最近我问了一个问题:。我在模拟存储方面取得了一些进展,但目前在save()方法中使用update()模拟模型上的存储时遇到了一个问题 当前情况: <..crop..> import mock current_storage = 'django.core.files.storage.default_storage._wrapped' def _mock_storage(): return mock.MagicMock(spec=Storage

我有一个小项目,我正在做一些测试。最近我问了一个问题:。我在模拟存储方面取得了一些进展,但目前在save()方法中使用update()模拟模型上的存储时遇到了一个问题

当前情况:

<..crop..>
import mock

current_storage = 'django.core.files.storage.default_storage._wrapped'
def _mock_storage():
    return mock.MagicMock(spec=Storage, name="StorageMock")

class ProjectsTest(TestCase):
    fixtures = ['projects']

    @mock.patch(current_storage, _mock_storage())
    def _create_project(self, name):
    return Project.objects.create(
            name=name,
            short_description="Short description A",
            full_description="Full description A",
            url="http://test-project-url.com/",
            is_published=True)

    @mock.patch(current_storage, _mock_storage())
    def _create_project_image(self, project, name):
    return ProjectImage.objects.create(
            project=project,
            name=name,
            description="Description",
            image=self._create_mock_image(name="Mocked Image"),
            is_primary=True,
            is_published=True)
stacktrace:

Creating test database for alias 'default'...
.......E.
======================================================================
ERROR: test_unset_current_primary_image_on_save (projects.tests.ProjectsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/edwin/git/portofolio/apps/projects/tests.py", line 105, in test_unset_current_primary_image_on_save
    self._create_project_image(project=project, name="Image A2")
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "/home/edwin/git/portofolio/apps/projects/tests.py", line 42, in _create_project_image
    is_published=True)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/query.py", line 399, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/edwin/git/portofolio/apps/projects/models.py", line 91, in save
    return super(ProjectImage, self).save(*args, **kwargs)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 796, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 824, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 908, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 947, in _do_insert
    using=using, raw=raw)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/query.py", line 1045, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1053, in execute_sql
    for sql, params in self.as_sql():
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1006, in as_sql
    for obj in self.query.objs
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 940, in prepare_value
    'can only be used to update, not to insert.' % (value, field)
ValueError: Failed to insert expression "<MagicMock name='StorageMock.save().width.resolve_expression()' id='139904200277904'>" on projects.ProjectImage.image_width. F() expressions can only be used to update, not to insert.

----------------------------------------------------------------------
Ran 9 tests in 0.123s
正在为别名“default”创建测试数据库。。。
E
======================================================================
错误:保存(projects.tests.ProjectsTest)时测试\u取消设置\u当前\u主图像\u
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“/home/edwin/git/portofolio/apps/projects/tests.py”,第105行,在test\u unset\u current\u primary\u image\u on\u save中
self.\u创建\u项目\u图像(项目=项目,名称=“图像A2”)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/mock/mock.py”,第1305行,带补丁
返回函数(*参数,**键盘)
文件“/home/edwin/git/portofolio/apps/projects/tests.py”,第42行,在创建项目图片中
是否已发布(为真)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/manager.py”,第85行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/query.py”,第399行,在create中
对象保存(force_insert=True,using=self.db)
文件“/home/edwin/git/portofolio/apps/projects/models.py”,第91行,保存
返回超级(投影图像,自我)。保存(*args,**kwargs)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/base.py”,第796行,保存
强制更新=强制更新,更新字段=更新字段)
保存库中的文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/base.py”,第824行
更新=自我。保存表格(原始、cls、强制插入、强制更新、使用、更新字段)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/base.py”,第908行,在保存表格中
结果=self.\u do\u insert(cls.\u base\u manager,using,fields,update\u pk,raw)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/base.py”,第947行,插入
使用=使用,原始=原始)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/manager.py”,第85行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/query.py”,第1045行,插入
return query.get\u编译器(using=using).execute\u sql(return\u id)
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第1053行,在execute_sql中
对于sql,self.as_sql()中的参数为:
as_sql中的文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第1006行
对于self.query.objs中的obj
文件“/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第940行,在prepare_值中
'只能用于更新,不能用于插入。“%”(值,字段)
ValueError:无法在projects.ProjectImage.image\u宽度上插入表达式“”。F()表达式只能用于更新,不能用于插入。
----------------------------------------------------------------------
在0.123s内运行了9个测试
问题: 如何在具有模拟存储的模型中正确测试更新?或者我想在这里做一些完全不可能的事情


如有任何建议、解释或推动正确方向以解决此问题,我们将不胜感激。谢谢。

我也有同样的问题:(
Creating test database for alias 'default'...
.......E.
======================================================================
ERROR: test_unset_current_primary_image_on_save (projects.tests.ProjectsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/edwin/git/portofolio/apps/projects/tests.py", line 105, in test_unset_current_primary_image_on_save
    self._create_project_image(project=project, name="Image A2")
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "/home/edwin/git/portofolio/apps/projects/tests.py", line 42, in _create_project_image
    is_published=True)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/query.py", line 399, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/edwin/git/portofolio/apps/projects/models.py", line 91, in save
    return super(ProjectImage, self).save(*args, **kwargs)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 796, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 824, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 908, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/base.py", line 947, in _do_insert
    using=using, raw=raw)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/query.py", line 1045, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1053, in execute_sql
    for sql, params in self.as_sql():
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1006, in as_sql
    for obj in self.query.objs
  File "/home/edwin/.virtualenvs/portofolio/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 940, in prepare_value
    'can only be used to update, not to insert.' % (value, field)
ValueError: Failed to insert expression "<MagicMock name='StorageMock.save().width.resolve_expression()' id='139904200277904'>" on projects.ProjectImage.image_width. F() expressions can only be used to update, not to insert.

----------------------------------------------------------------------
Ran 9 tests in 0.123s