如何解决Django 使用 assertIsInstance 测试自定义信号参数:AssertionError: <class 'path.to.Foo'> 不是 <class 'path.to.Foo'> 的实例
我使用的是 Django 3.2
我编写了一个引发自定义事件的应用,我正在为这些应用编写测试。
这是我的代码的相关部分:
class TestAppModel(TestCase):
# .. set up instance variables etc.
def test_liked_signal_emits_correct_data(self):
self.signal_was_called = False
self.sender = None
self.instance = None
self.event_type = None
self.actor = None
def handler(sender,instance,event_type,actor,**kwargs):
self.signal_was_called = True
self.sender = sender
self.instance = instance
self.event_type = event_type
self.actor = actor
item_liked.connect(handler)
self.daddy.like(self.admin_user)
# Check that the sender is a Foo
self.assertIsInstance(self.sender,Foo) # <- Nonsensical error emitted here
当我运行测试时,我收到错误消息:
AssertionError:
这显然是一条无意义的错误消息,无法帮助我解决问题。
我的问题是为什么我无法使用 assertIsInstance
检查实例类型,以及如何检查信号接收器中的类类型?
解决方法
信号中的 sender
通常是实例的类。因此,您编写 self.assertIsInstance(self.sender,Foo)
相当于编写 self.assertIsInstance(Foo,Foo)
这当然是不正确的,因为 Foo
不是 Foo
的实例(它可能是 {{1} }、object
和 type
(ModelBase
的元类))。例如,请参阅以下代码段:
Model
相反,您想使用 class Foo:
pass
print(isinstance(Foo,Foo)) # False
print(isinstance(Foo,object)) # True
print(isinstance(Foo,type)) # True
而不是 assertIs
:
assertIsInstance
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。