2016-02-23 11 views
5

Sto provando a patchare una classe istanziata dalla classe che sto provando a testare, ma non funziona. Ho letto i vari documenti ma non ho ancora trovato quello che sto facendo male. Ecco il frammento di codice:Impossibile patch classe istanziata dalla classe testata utilizzando unittest

In tests/Test.py:

from module.ClassToTest import ClassToTest 

class Test(object): 

    @mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 
    def setUp(self, my_class_mock): 
     self.instance = my_class_mock.return_value 
     self.instance.my_method.return_value = "def" 
     self.class_to_test = ClassToTest() 

    def test(self): 
     val = self.class_to_test.instance.my_method() #Returns 'abc' instead of 'def' 
     self.assertEqual(val, 'def') 

In module/ClassToPatch.py:

class ClassToPatch(object): 
    def __init__(self): 
     pass 
    def my_method(self): 
     return "abc" 

In module/ClassToTest.py:

from module.ClassToPatch import ClassToPatch 

class ClassToTest(object): 
    def __init__: 
     # Still instantiates the concrete class instead of the mock 
     self.instance = ClassToPatch() 

So che in questo caso ho potuto facilmente iniettare il dipendenza, ma questo è solo un esempio. Inoltre, utilizziamo una singola classe per criterio di file, con il file chiamato come la classe, da cui la strana denominazione di importazione.

+2

Prova @ mock.patch ('module.ClassToTest.ClassToPatch', autospec = False) –

+0

In futuro, inserisci il codice di esempio in [MCVE] (http://stackoverflow.com/help/mcve); c'erano molti bug nel codice postato e non si può fare affidamento su qualcuno che abbia familiarità con il problema per individuare immediatamente il problema e offrire una soluzione. –

+0

Ok, ne prenderò nota – sixtstorm1

risposta

1

Norbert menziona, la correzione è quello di cambiare la linea finto da

@mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 

a

@mock.patch('module.ClassToTest.ClassToPatch', autospec = False) 

According to the docs:

La patch() decoratrice/contesto Manager rende facile prendere in giro classi o oggetti in un modulo sotto test. L'oggetto specificato verrà sostituito con un mock (o altro oggetto) durante il test e ripristinato al termine del test.

Si sta testando il modulo ClassToTest, non il modulo ClassToPatch.

Problemi correlati