PROBLEMA Come si crea il mock di una classe

fabio_1

Utente Attivo
231
8
CPU
i5-6500
Scheda Madre
ASRock H170 Pro4S
HDD
Samsung 870QVO 1TB, Samsung 850EVO 250GB, HD Toshiba 2TB
RAM
Corsair DD4 2133 C13 2x4GB
GPU
Sapphire R9 380 4GB NITRO
Audio
Integrata + DAC Audioengine D1
Monitor
LG 24MB56HQ-B IPS
PSU
XFX 550 Black
Case
Corsair Spec-03
Periferiche
Casse Edifier R1800TIII
OS
Windows 10
Qui c'è il mio model.py:
Python:
class List(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
        on_delete=models.PROTECT)
    
    def get_absolute_url(self):
        return reverse('view_list', args=[self.id])

    @staticmethod
    def create_new(first_item_text, owner=None):
        list_ = List.objects.create(owner=owner)
        Item.objects.create(text=first_item_text, list=list_)


class Item(models.Model):
    text = models.TextField(default='')
    list = models.ForeignKey(List, default=None, on_delete=models.PROTECT)
    
    class Meta:
        ordering = ('id',)
        unique_together = ('list', 'text')
        
    def __str__(self):
        return self.text

Qui la mia views.py:
Python:
def new_list(request):
    form = NewListForm(data=request.POST)
    if form.is_valid():
        list_ = List()
        list_.owner = request.user
        list_.save()
        return redirect(str(list_))
    return render(request, 'home.html', {'form': form})

Qui la mia form.py:
Python:
class NewListForm(ItemForm):

    def save(self, owner):
        if owner.is_authenticated:
            List.create_new(first_item_text=self.cleaned_data['text'],
                owner=owner)
        else:
            List.create_new(first_item_text=self.cleaned_data['text'])

E qui il mio test.py:
Python:
@patch('lists.views.NewListForm')
class NewListViewUnitTest(unittest.TestCase):

    def setUp(self):
        self.request = HttpRequest()
        self.request.POST['text'] = 'new list item'
        self.request.user = Mock()
        #self.request.user = Mock(spec=User)

    def test_passes_POST_data_to_NewListForm(self, mockNewListForm):
        new_list(self.request)
        mockNewListForm.assert_called_once_with(data=self.request.POST)

Perchè mi dice ValueError: Cannot assign "<Mock id=...>": "List.owner" must be a user instance?
Sembra non riconosca self.request.user = Mock() come un User. Invece usando self.request.user = Mock(spec=User) mi da l'errore AttributeError: Mock object has no attribute '_state' ma eppure i mock non possono essere chiamati con qualsiasi attributo, ovvero con gli attributi della classe che gli viene passata?
Qualcuno sa spiegarmi il problema o più semplciemente come fare il test? Grazie

Clipboard01.png
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!