Je veux comprendre comment activer @patch
une fonction à partir d'un module importé.
C'est là que je suis si loin.
app / mocking.py:
from app.my_module import get_user_name
def test_method():
return get_user_name()
if __name__ == "__main__":
print "Starting Program..."
test_method()
app / mon_module / __ init__.py:
def get_user_name():
return "Unmocked User"
test / mock-test.py:
import unittest
from app.mocking import test_method
def mock_get_user():
return "Mocked This Silly"
@patch('app.my_module.get_user_name')
class MockingTestTestCase(unittest.TestCase):
def test_mock_stubs(self, mock_method):
mock_method.return_value = 'Mocked This Silly')
ret = test_method()
self.assertEqual(ret, 'Mocked This Silly')
if __name__ == '__main__':
unittest.main()
Cela ne fonctionne pas comme je m'y attendais. Le module "patché" renvoie simplement la valeur non moquée de get_user_name
. Comment simuler des méthodes d'autres packages que j'importe dans un espace de noms en cours de test?
Mock
, qui est incluse dans python3.3 + asunittest.mock
.Réponses:
Lorsque vous utilisez le
patch
décorateur duunittest.mock
package, vous ne corrigez pas l'espace de noms à partir duquel le module est importé (dans ce casapp.my_module.get_user_name
), vous le corrigez dans l'espace de noms en cours de testapp.mocking.get_user_name
.Pour faire ce qui précède,
Mock
essayez quelque chose comme ci-dessous:La documentation standard de la bibliothèque comprend une section utile décrivant cela.
la source
get_user_name
est dans un module différent detest_method
. Existe-t-il un moyen de se moquer de quelque chose dans un sous_module? Je l'ai réparé d'une manière moche ci-dessous.get_user_name
soit dans un module différent de celuitest_method
que vous importez dans la fonction,app.mocking
ils sont dans le même espace de noms.get_user_name_patch
.Bien que la réponse de Matti John résout votre problème (et m'a aidé aussi, merci!), Je suggérerais cependant de localiser le remplacement de la fonction originale 'get_user_name' par la fonction simulée. Cela vous permettra de contrôler quand la fonction est remplacée et quand elle ne l'est pas. De plus, cela vous permettra de faire plusieurs remplacements dans le même test. Pour ce faire, utilisez l'instruction 'with' d'une manière assez similaire:
la source
patch
comme décorateur ou gestionnaire de contexte est spécifique au cas d'utilisation. Par exemple, vous pouvez utiliserpatch
comme décorateur pour simuler une valeur pour tous les tests d'une classexunit
oupytest
, tandis que dans d'autres cas, il est utile d'avoir le contrôle finement fourni par le gestionnaire de contexte.