Jac*_*ans 2 python django unit-testing
我试图断言在保存我的客户端模型的实例时调用 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)
Run Code Online (Sandbox Code Playgroud)
我设置了一个看起来像这样的测试
@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
Run Code Online (Sandbox Code Playgroud)
我希望这个测试能够通过,因为called运行测试时打印语句出现在捕获的标准输出中。
然而,测试运行者似乎认为我的模拟函数根本没有被调用。
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
Run Code Online (Sandbox Code Playgroud)
打印语句似乎表明该函数在测试期间被调用,而测试断言则表明不然。我在模拟库中遗漏了一些明显的东西吗?
修补模拟对象仅适用于在运行时查找方法的调用者。信号处理程序保存在表中,因此它们不会查找您的模拟版本。
这有点 hacky,但您可以让信号处理程序调用辅助函数。然后可以模拟辅助函数。
# reports/signals.py
@receiver(post_save, sender=Client)
def create_client_draft_handler(sender, instance=None, created=False, **kwargs):
create_client_draft(sender, instance, created, **kwargs)
def create_client_draft(sender, instance=None, created=False, **kwargs):
"""Guarantees a DraftSchedule exists for each Client post save
This function can be mocked, because it's called by name.
"""
print('called') # Log to stdout when called
if created and not kwargs.get('raw', False):
DraftSchedule.objects.get_or_create(client=instance)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3928 次 |
| 最近记录: |