2016-11-10 3 views
1

Ich bin mir nicht sicher, was ich falsch mache. Vielleicht habe ich das falsche Ende des Stocks mit Spott. Aber meine Annahme war, dass wenn du Mocks verwendest, es im Grunde ein bisschen Magie macht und Objekte in deinem ursprünglichen Code ersetzt.Ersetzen eines Objekts mit Mocks

sites.py

class Sites: 
    def __init__(self): 
     pass 

    def get_sites(self): 
     return ['washington', 'new york'] 

my_module.py

from mylib import sites 

def get_messages(): 
    # get Sites 
    sm = sites.Sites() 
    sites = sm.get_sites() 
    print('Sites:' , sites) 

    for site in sites: 
     print('Test: ' , site) 

my_test.py

import my_module 
import unittest 
from unittest.mock import patch 


class MyModuleTestCase(unittest.TestCase): 

    @patch('my_module.Sites') 
    def test_process_the_queue(self, mock_sites): 
     mock_sites.get_sites.return_value = ['london', 'york'] 

     print(mock_sites.get_sites()) 
     my_module.get_messages() 

if __name__ == '__main__': 
    unittest.main() 

Ausführen dieses ich folgende Ausgabe:

.['london', 'york'] 
Sites: <MagicMock name='Sites().get_sites()' id='139788231189504'> 

---------------------------------------------------------------------- 
Ran 1 test in 0.002s 

OK 
[Finished in 0.1s] 

Ich erwartete die zweite Druckausgabe (die in my_module.py auftritt), die gleiche wie die erste und die Schleife durch die Liste, die ich als Rückgabewert durchlaufen.

Jede Hilfe würde sehr geschätzt werden. auf jeden Fall nicht sehr intuitiv zu bedienen

Aktualisiert Um zu zeigen, wie ich ursprünglich meine Klasse

Antwort

1

Python Mock importieren, während dumme mächtig ist.

Die print-Anweisung zeigt, dass Sie my_module.Sites richtig patchen, aber Sie den get_sites Rückgabewert nicht korrekt registriert haben, und es sollte sein:

mock_sites.return_value.get_sites.return_value = ['london', 'york']

Die Aussage Druck zeigt, dass es einen Anruf an Sites().get_sites() war registriert auf gepatchten Objekt:

Sites: <MagicMock name='Sites().get_sites()' id='139788231189504'>

Beim Lesen dieses I finden es hilfreich, die Instanziierung der Mock-Sites zu übersetzen () zu return_value

Sites.return_value.get_sites.return_value

Der Rückgabewert Sie fehlen Objekt darstellt: Sites().

+0

Ärgerlicher funktioniert dies für die Demo, die ich gemacht, aber nicht für meine tatsächlicher Code>. < –

+0

Woohoo. Habe es geschafft zu arbeiten! Danke, dass du mich in die richtige Richtung gelenkt hast. –

0

Das Problem, das ich hatte, war mit der Art, wie ich importierte und meine externe Klasse anruft.

from mylib import sites 
sm = sites.Sites() 

Mock ist viel glücklicher, wenn Sie verwenden:

from mylib.sites import Sites 
sm = Sites() 

Dies zusammen mit dm03514 Antwort hat mir geholfen, es zum Laufen zu bringen