- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个模型,我正在尝试在不调用数据库层的情况下测试验证。我不会用文字描述,而是会发布一些示例代码。这里的问题是 ForeignKey 与 Bar 的关系,它与我要测试的内容无关,但阻止我运行我想要的测试。
首先,myapp/models.py
:
from django.core.exceptions import ValidationError
from django.db import models
class BadFooError(ValidationError):
pass
class Bar(models.Model):
description = models.CharField(max_length=20)
class Foo(models.Model):
bar = models.ForeignKey(Bar)
a_value = models.IntegerField()
b_value = models.BooleanField()
def clean(self):
super(Foo, self).clean()
if self.b_value and self.a_value > 50:
raise BadFooError("No good")
接下来,myapp/tests.py
:
from unittest import TestCase
from mock import MagicMock
from . import models
class SimpleTest(TestCase):
def test_avalue_bvalue_validation(self):
foo = models.Foo()
foo.a_value = 30
foo.b_value = True
foo.bar = MagicMock(spec=models.Bar)
self.assertRaises(models.BadFooError, foo.full_clean)
def test_method_2(self):
foo = models.Foo()
foo.a_value = 30
foo.b_value = True
foo.bar = MagicMock()
foo.__class__ = models.Bar
self.assertRaises(models.BadFooError, foo.full_clean)
def test_method_3(self):
foo = models.Foo()
foo.a_value = 30
foo.b_value = True
# ignore it and it will go away ...??
self.assertRaises(models.BadFooError, foo.full_clean)
最后,python manage.py test myapp
EEE
======================================================================
ERROR: test_avalue_bvalue_validation (myapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "~/sandbox/myapp/tests.py", line 14, in test_avalue_bvalue_validation
foo.bar = MagicMock(spec=models.Bar)
File "~/dsbx/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 408, in __set__
instance._state.db = router.db_for_write(instance.__class__, instance=value)
File "~/dsbx/local/lib/python2.7/site-packages/django/db/utils.py", line 142, in _route_db
return hints['instance']._state.db or DEFAULT_DB_ALIAS
File "~/dsbx/local/lib/python2.7/site-packages/mock.py", line 658, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute '_state'
======================================================================
ERROR: test_method_2 (myapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "~/sandbox/myapp/tests.py", line 21, in test_method_2
foo.bar = MagicMock()
File "~/dsbx/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 405, in __set__
self.field.name, self.field.rel.to._meta.object_name))
ValueError: Cannot assign "<MagicMock id='31914832'>": "Foo.bar" must be a "Bar" instance.
======================================================================
ERROR: test_method_3 (myapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "~/sandbox/myapp/tests.py", line 29, in test_method_3
self.assertRaises(models.BadFooError, foo.full_clean)
File "/usr/lib/python2.7/unittest/case.py", line 471, in assertRaises
callableObj(*args, **kwargs)
File "~/dsbx/local/lib/python2.7/site-packages/django/db/models/base.py", line 926, in full_clean
raise ValidationError(errors)
ValidationError: {'bar': [u'This field cannot be null.']}
----------------------------------------------------------------------
Ran 3 tests in 0.003s
FAILED (errors=3)
Creating test database for alias 'default'...
Destroying test database for alias 'default'...
所以我的问题是……怎么办?
最佳答案
在我的单元测试中,我只是将 _state
分配给一个新的 Mock 实例,就像对您的第一个示例单元测试的这个小改动一样:
def test_avalue_bvalue_validation(self):
foo = models.Foo()
foo.a_value = 30
foo.b_value = True
bar = Mock(spec=models.Bar)
bar._state = Mock()
foo.bar = bar
self.assertRaises(models.BadFooError, foo.full_clean)
但是,为了将您的验证作为黑盒进行测试,我会将验证代码提取到您模型上的一个单独方法中,我将从 clean()
方法内部调用该方法。然后,您可以专门对该验证代码进行单元测试。您仍然需要执行 _stage = Mock()
分配,以便您可以创建 Foo 的实例,但至少您将最大限度地减少对 Django 的调用。
关于python - 如何使用 Mock 库模拟 Django ForeignKey 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847332/
我正在尝试使用 limit_choices_to 来限制 Django 管理员对 ForeignKey 的选择,但我不知道如何正确地做到这一点。 如果类别 ID 为 16,此代码将执行我想要的操作,但
我有以下实体: @Entity(indices = {@Index("address")}, foreignKeys = @ForeignKey( entity = Address.
我是 Websphere 应用程序服务器的新手。请让我知道我哪里做错了。我收到 java.lang.NoSuchMethodError: javax.persistence.JoinColumn.fo
我最近将我的 Wicket 6 应用程序从 Spring 3 升级到了 Spring 4。 当我在 Jetty 7 上本地运行应用程序时,它运行良好。 当我将其部署到 Tomcat 7 时,出现以下错
这不是一个重复的问题。正如这个问题的正文中所解释的那样,出于各种原因,我不得不返回到一个旧的 Spring 和 Hibernate 项目。该项目使用这两个框架通过 Apache Tomcat 连接到
我有一个用 Spring MVC 编写并使用 Hibernate 的简单的两表应用程序。一切正常,但如果我尝试对其中一个 Controller 进行单元测试,我会收到消息: Invocation of
我正在使用这些环境开发应用程序: 打开 GlassFish 3.1.2.2 Spring 专家 MySQL hibernate POM.XML 4.0.0 com.andriasof
我正在使用 Spring Boot 在具有许多 Hibernate 依赖项的现有项目上做一个原型(prototype)。我正在尝试定义一个自定义的 LocalEntityManagerFactoryB
如何从Django自带的auth包中导入User,我需要做的: from django.contrib.auth.models import User 虽然要引用相同的 User 模型来创建 Fore
我正在尝试这样的一些: class F(models.Model): class Meta: abstract = True class C1(F): class C2(F):
感谢您检查这一点。 我的愚蠢怀疑: 我在 Django 中定义了以下模型: class School(models.Model): name = models.CharField(max_le
我有两个模型。 parent 和 child 。因为 child 和 parent 有一些不同的领域,所以我不得不将他们分开,而不是有一个单一的模型人。因为 child 应该有父亲和母亲,所以我在不同
当我尝试为以下模型进行迁移时: class Location(models.Model): name = models.CharField(max_length=200) latitu
是否可以保证ForeignKey不被删除? 最好的例子在 UserProfile 上: class UserProfile(Model): user = models.OneToOneFiel
在Django docs ForeignKey 的条目,它说: If you need to create a relationship on a model that has not yet bee
我有一个模型,我想在其中保存一个新实例(行)。我有 ForeignKey 的主键,但我没有对象本身(假设它来自某个地方)。有什么方法可以在没有原始 SQL 且无需获取实例的情况下保存它吗? 这是模型:
因此,在定义模型之前,我需要为该模型创建一个外键。考虑以下模型: class Question(models.Model): """Model for question.""" que
有一个面试测试,下面是表格和结构 Table Person = id, name, dob, dod, mother_id, father_id Primary Key (id) Foreign
前言 大家使用 Django 创建模型的时候一定会经常使用 ForeignKey 来创建两个表格之间多对一的外键关系,例如B中有一个 models.ForeignKey(A) 。而当我们需要反向查
我正在删除项目中的一些无用代码,我有机会删除自项目启动以来我们一直在使用的对第三方应用程序的依赖。我们的一个模型在第三方应用程序中有一个模型的外键,我在尝试对项目的新实例应用迁移时遇到了麻烦。 示例模
我是一名优秀的程序员,十分优秀!