Patch - Pourquoi ne pas la relative patch nom de la cible de travail?
J'ai importé une classe à partir d'un module, mais quand j'essaie de corriger le nom de la classe sans le module comme un préfixe j'obtiens une erreur de type:
TypeError: Need a valid target to patch. You supplied: 'MyClass'
Par exemple, le code suivant me donne l'erreur ci-dessus:
import unittest
from mock import Mock, MagicMock, patch
from notification.models import Channel, addChannelWithName, deleteChannelWithName, listAllChannelNames
class TestChannel(unittest.TestCase):
@patch("Channel")
def testAddChannelWithNamePutsChannel(self, *args):
addChannelWithName("channel1")
Channel.put.assert_called_with()
Alors que cette seconde version du code ne me donne pas l'erreur de type:
import unittest
from mock import Mock, MagicMock, patch
from notification.models import Channel, addChannelWithName, deleteChannelWithName, listAllChannelNames
class TestChannel(unittest.TestCase):
@patch("notification.models.Channel")
def testAddChannelWithNamePutsChannel(self, *args):
addChannelWithName("channel1")
Channel.put.assert_called_with()
Pourquoi est-ce? Pourquoi ne puis-je Canal de référence que comme "Canal" dans d'autres endroits, mais pour le patch, j'ai besoin du module préfixe de ne pas obtenir une erreur? Aussi, j'ai le sentiment que le fait de donner la pleine module préfixe n'est pas de travail, soit parce que quand j'ai Canal d'appel.mettre.assert_called_with() j'obtiens le message d'erreur que assert_called_with n'est pas un attribut de la manche.mettre. Quelqu'un peut m'expliquer ce qu'il se passe? Merci beaucoup!
Vous devez vous connecter pour publier un commentaire.
La
patch
décorateur exige la cible sur un chemin parsemé, comme indiqué dans le la documentation:"Channel"
est juste une chaîne, etpatch
ne dispose pas de suffisamment d'informations pour trouver la bonne classe. Ce n'est pas le même que le nomChannel
vous utilisez ailleurs, ce qui est importé dans le haut du module.Le deuxième test échoue car le Canal est importé dans le module de test puis patch remplace Canal dans la notification.les modèles avec un objet fantaisie. Ce patch fait n'est le changement de l'objet de la nom Canal utilisé à l'intérieur de la notification.modèles de point de. Le nom du Canal dans le module de test a déjà été définie, de sorte qu'il n'est pas affecté. C'est effectivement mieux expliqué ici: http://www.voidspace.org.uk/python/mock/patch.html#id1
Pour accéder à la version corrigée de votre objet, vous pouvez accéder au module directement:
Ou utiliser la version corrigée passé comme un argument supplémentaire à l'décoré de la fonction:
Si vous voulez juste rapidement patch une seule méthode sur un objet, il est généralement plus facile d'utiliser le
patch.object
décorateur: