Testing update view: how to pass.change value data in updateview with form?

Viewed 12

I try to write testcase for one of my view that use a form. views.py

def parametrage(request,pk):
    
    parametrage = get_object_or_404(Parametrage, asp_par_cle = pk)
    form = ParametrageForm(request, data=request.POST or None, instance = parametrage)
    print('form.data',form.data)

    if form.is_valid():
        parametrage = form.save()
        parametrage.opr_nom = request.user.username
        parametrage.opr_dat = timezone.now()
        form.save()

        return redirect('pharmacy:dashboard')

    return render(request, 'pharmacy/parametrage.html', {'form': form})

tests.py


class PharmacyParametrageTestCase(TestCase):
    
    def setUp(self):
        Parametrage.objects.create(asp_par_loc='TR',asp_par_ale=1,asp_par_con=8)
    
    def test_email_alert(self):
        instance = Parametrage.objects.get(asp_par_cle=1)
        data = json.dumps({"asp_par_ale":2,})
        response = self.client.post(reverse('pharmacy:parametrage', kwargs={'pk':1}),instance=instance, data=data, follow=True, content_type='application/json')
        self.assertEqual(response.status_code,200)
        self.assertEqual(Parametrage.objects.get(asp_par_cle=1).asp_par_ale,2)

The second assert failed because Parametrage instance is not updated. form.is_valid() return False and form.errors do not return any error. form.data is empty

obviously, I never change asp_par_ale value but don't know how to do that in tests. I try to pass data but doesn't work neither appreciate some help

1 Answers

i found i guess, when you said, object is not updated, you spoke only about opr_dat and opr_dat ? You called form.save() twice. You have to call isntance save function :

def parametrage(request,pk):
    
    parametrage = get_object_or_404(Parametrage, asp_par_cle = pk)
    form = ParametrageForm(request, data=request.POST or None, instance = parametrage)
    print('form.data',form.data)

    if form.is_valid():
        parametrage = form.save(commit=False)
        parametrage.opr_nom = request.user.username
        parametrage.opr_dat = timezone.now()
        parametrage.save()

        return redirect('pharmacy:dashboard')

    return render(request, 'pharmacy/parametrage.html', {'form': form})
Related