【发布时间】:2017-10-10 17:39:58
【问题描述】:
我试图断言在保存我的客户端模型实例时调用 post_save 信号接收器。
信号接收器如下所示:
# reports/signals.py
@receiver(post_save, sender=Client)
def create_client_draft(sender, instance=None, created=False, **kwargs):
"""Guarantees a DraftSchedule exists for each Client post save"""
print('called') # Log to stdout when called
if created and not kwargs.get('raw', False):
DraftSchedule.objects.get_or_create(client=instance)
我已经设置了一个看起来像这样的测试
@pytest.mark.django_db
@patch('reports.signals.create_client_draft')
def test_auto_create_draftschedule_on_client_creation(mock_signal):
client = mixer.blend(Client) # Creates a Client with random data
assert mock_signal.call_count == 1
我希望此测试能够通过,因为在运行测试时,called print 语句会出现在捕获的标准输出中。
但是,测试运行者似乎认为我的模拟函数根本没有被调用过。
mock_signal = <MagicMock name='create_client_draft' id='139903470431088'>
@pytest.mark.django_db
@patch('reports.signals.create_client_draft')
def test_auto_create_draftschedule_on_client_creation(mock_signal):
client = mixer.blend(Client)
> assert mock_signal.call_count == 1
E AssertionError: assert 0 == 1
E + where 0 = <MagicMock name='create_client_draft' id='139903470431088'>.call_count
reports/tests/test_signals.py:36: AssertionError
---------------------------------------------------------------------------------------------------------------------------------------------------- Captured stdout call -----------------------------------------------------------------------------------------------------------------------------------------------------
called
print 语句似乎表明该函数在测试期间被调用,而测试断言则表明并非如此。模拟库在这里我是否遗漏了一些明显的东西?
【问题讨论】:
-
尝试使用
settings.py文件所在文件夹的完整路径以及其中的任何子文件夹,例如{folder_containing_settings}.reports.signals.create_client_draft -
信号位于应用子文件夹
app/signals.py,而设置位于project/settings/test.py -
通常是路径问题,您如何在设置下的
INSTALLED_APPS中包含报告应用程序? -
我说的是
settings.py文件而不是test.py -
我怀疑
@patch在注册为信号后将函数替换为模拟。信号调度器仍然会引用原始函数并调用它而不是模拟函数。
标签: python django unit-testing