2014-07-13 3 views
0

Je suis en train de faire quelque chose comme ceci à des méthodes simulées sur un modèle Django en utilisant la bibliothèque maquette Python:Comment se moquer des méthodes enchaînées sur les modèles Django

# file: tasks.py 
def delete_ads(user):  
    # works fine and return a list of 4 MagicMock objects 
    ads = Classifieds.objects.filter(
     user=user 
    ) 

# file: tests.py 
def test_delete_ads(): 
    return_list = [MagicMock(name='1'), MagicMock(name='2'), MagicMock(name='3'), MagicMock(name='4')] 

    with patch('user.tasks.Classifieds') as classified_mock: 
     classified_mock.objects.filter.return_value = return_value 

Le code ci-dessus fonctionne très bien mais commence à renvoyer une seule MagicMock objet après que je change mon code à ceci:

# file: tasks.py 
def delete_ads(user):  
    # works fine and return a list of 4 MagicMock objects 
    ads = Classifieds.objects.filter(
     user=user 
    ).order_by('-added') 

# file: tests.py 
def test_delete_ads(): 
    return_list = [MagicMock(name='1'), MagicMock(name='2'), MagicMock(name='3'), MagicMock(name='4')] 

    with patch('user.tasks.Classifieds') as classified_mock: 
     classified_mock.objects.filter.order_by.return_value = return_value 

y at-il de toute façon que je peux le faire correctement même quand je suis méthode cHAÎNAGE appelle des modèles Django?

+0

Vous avez un certain nombre de fautes de frappe dans votre question. Etes-vous sûr que ceux-ci ne sont pas aussi dans votre code? – Dunes

+0

@Dunes Yep Je suis assez sûr que les fautes de frappe ne sont pas dans mon code. J'ai tapé ceci séparément. – Rafay

Répondre

1

Lorsque vous vous moquez de la valeur de retour d'une fonction simulée, vous devez vous moquer de la fonction telle qu'elle serait appelée dans le code. parent.child crée un attribut appelé child sur le modèle parent. Considérant que, parent().child crée un attribut appelé child sur la valeur de retour simulé de parent().

Questions connexes