微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

django - 在视图中测试 send_mail 函数

如何解决django - 在视图中测试 send_mail 函数

我正在尝试测试放置在以下视图中的 send_mail 函数(跳到最后查看 send_mail 执行):

@login_required
def item_create(request,idType,idSubType=None):
    
    type = Type.objects.get(id=idType)
    form = item_Form(request.POST or None)
    form.fields['subType'].queryset = SubType.objects.filter(type=type).order_by('name')
    if idSubType:
        form.fields['subType'].initial = SubType.objects.get(id=idSubType)
    form.fields['company'].queryset = request.user.profile.companies


    context = {
        'form': form,'title': 'INSERIMENTO ' + type.name.upper(),# primo tab dei dati anagrafici
        'tab_active_1': True,}
    form_specs = None
    if type.name == 'Mezzi' and idSubType:
        subType = SubType.objects.get(id=idSubType)
        specs_name = subType.subTypeGroup.name
        form_class = getattr(forms,specs_name + 'Form')
        form_specs = form_class(request.POST or None)
        context['form_specs'] = form_specs
        context['title_specs'] = 'Dati Specifici ' + subType.name

    if request.method == 'POST':
        if form.is_valid():
            if form_specs:
                if form_specs.is_valid():
                    item = form.save()
                    specs = form_specs.save(commit=False)
                    specs.item = item
                    specs.save()
                else:
                    return render(request,'equipment/item_detail.html',context)
            else:
                item = form.save()
            mail_context = {
                'base_url': settings.GESTIONALE_URL,'subType': item.subType,'brand': item.brand,'model': item.model_type,'serial_number': item.serial_number,'supplier': item.supplier.legal_name,'item_abs_url': item.get_absolute_url(),}
            payload = render_to_string('equipment/mails/new_item_message.html',mail_context)
            carlo = User.objects.filter(username__icontains='carlo.cogni').first()
            monica = User.objects.filter(username__icontains='monica').first()

            send_mail('Avviso inserimento nuova attrezzatura',payload,settings.EMAIL_HOST_USER,(carlo.email,monica.email),html_message=payload)
            #########
            messages.success(request,f'Dati aggiornati correttamente',fail_silently=True)
            return HttpResponseRedirect(item.get_absolute_url())
        else:
            return render(request,context)

    else:
        form.fields['is_purchased_new'].initial = True
        return render(request,context)
    

如果对象创建正确,系统会自动发送一封电子邮件

在我的测试中,为了寻求帮助,我尝试了以下解决方案: 在设置中添加

class CustomTestCase(TestCase):
    def setUp(self):
        settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'

将电子邮件保存在内存中,然后保存在我的主测试类中:

class EquipmentTest(CustomTestCase):
 def setUp(self):
        super().setUp()
        # per il test dell'invio mail
        self.carlo = User.objects.create_user('carlo.cogni','','dskjhkjshdkqhudh')
        self.monica = User.objects.create_user('monica','dskjhshdkqhudh')
        self.carlo.email = 'carlo@test.it'
        self.monica.email = 'monica@test.it'

class ItemTest(EquipmentTest):
    def test_post_item_create(self):
        post_data = {
            'subType': self.subType.id,'brand': 'a brand','model_type': 'a type','serial_number': 'a serial','is_active': True,'company': self.company.id,'supplier': self.supplier.id,'purchased_date': '2020-10-10','purchased_price': '10','is_purchased_new': True,'used_by': 'Brunetti','notes': 'some notes'
        }
        url = reverse('equipment:item_create',args=[self.type.pk])
        response = self.client.post(url,post_data,follow=True)
        self.assertEqual(response.status_code,200)
        print(response.content)
        self.assertNotContains(response,'Questo errore è già stato segnalato automaticamente al gestore del sistema')
        self.assertContains(response,self.supplier.legal_name)
        self.assertTrue(len(mail.outBox) > 0)
        self.assertIn(mail.outBox.subject,'Avviso inserimento nuova attrezzatura')

我得到的错误是 mail.outBox 不 > 0,这意味着我猜没有电子邮件保存在内存中。视图被正确执行,为了确保它我打印了 response.content,我实际上被重定向到了 item.get_aboslute_url 页面

可能有什么问题? 我认为将邮件保存在内存中可能是实现简单快速测试的最佳解决方案。

谢谢

C

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。