2016-07-19 3 views
1

Ich habe diese URL hier gefunden: python mocking raw input in unittestsGibt es eine Möglichkeit, Methoden mit viel Raw_Input in Django zu testen?

und es beantwortet meine Frage etwas, aber was ist mit dem Fall, wenn es eine Menge von raw_inputs? so etwas wie dieses ...

class MyModel() 
    def my_method(self): 
     raw_input("do you want to play a game?: ") 
     ...do something 
     raw_input("Do you want to do something else?: ") 
     ...do something 
+0

Wenn Ihre Klasse ein "Modell" (in der MVC Bedeutung) sein soll, dann sollte es nichts wie 'raw_input()' Aufrufe haben ... –

+0

es ist mehr Backend-Methoden zum Verwalten von Klassen – deltaskelta

+1

Selbst dann hat es In einer Modellklasse gibt es nichts zu tun ... Verwenden Sie eine eigene Klasse (oder einen Satz von Klassen), um mit der Benutzeroberfläche zu arbeiten (wenn es sich um ein Django-Projekt handelt, dann fallen mir benutzerdefinierte Verwaltungsbefehle ein). –

Antwort

1

Einfache Antwort: hüllt jeden Aufruf raw_input() in verschiedenen Objekt, das Sie leicht spotten kann.

1

Wenn ich richtig verstehe, wollten Sie jede raw_input Methode vortäuschen, aber unterschiedliche Rückgabewerte setzen. unittest.mock kommt mit side_effect Eigenschaften. Das kann in diesem Fall hilfreich sein. https://docs.python.org/3/library/unittest.mock.html#quick-guide

Python Mock object with method called multiple times

Der entscheidende Punkt ist hier die Paramater der raw_input Funktion.

Beispiel:

from unittest import mock 
from unittest import TestCase 

class MyTest(TestCase): 
    @mock.patch.object(__builtins__, 'raw_input') 
    def test_my_method(self, mock_input): 
     # If raw_input called thrice in the my_method 
     mock_input.side_effect = lambda param: {'First': 'Great', 'Second': 'Good', 'Third': 
'Awesome'}.get(param, 'Default return') 
     my_class = actual_module.MyModel() 
     self.assertEqual(my_class.my_method(), 'GreatGoodAwesome') 

Hier First ', 'Zweite' 'Third' sind die eigentliche Zeichenfolge des raw_input in dem Verfahren verwendet. Die einzige Sache, die Sie ändern müssen, ist das Ersetzen der "ersten" mit "Möchten Sie ein Spiel spielen ?:" und so weiter.

Und angenommen my_method gibt die Verkettung der Antwort der Methode raw_input zurück. Bitte beachten Sie, dass der Code nicht ordnungsgemäß getestet wurde.

+0

Ich habe diese Dokumente gelesen und ich denke, das wird den Trick für mich machen, aber ich bin unsicher, wie ich es in meinem Beispiel ausführen soll. Könntest du ein einfaches Beispiel schreiben, wenn du Zeit hast? – deltaskelta

Verwandte Themen