问题描述
我正在尝试测试放置在以下视图中的 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 (将#修改为@)