2012-04-12 29 views
5

Mam zestaw testów (za pomocą nosa, nie unitest) i chcę załatać funkcję, aby zwrócić określoną sekwencję wartości dla każdego testu w klasie testowej. Moja pierwsza próba, stosując uproszczony przykład, było:Łatka funkcji za pomocą Mock

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Jednak instancja MagicMock jest tworzony tylko raz, więc drugi test nie powiedzie się, gdy skutki uboczne zabraknie. Każdą metodę testowania mogę załatwić osobno, ale nie chcę duplikować dekoratora łatek nad wszystkimi (jest o wiele więcej testów niż w tym przykładzie!). Innym sposobem, w jaki mógłbym to zrobić, jest utworzenie łatki w kod instalacyjny podobny do tego:

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Jednak zapisywanie i przywracanie oryginalnej definicji funkcji wydaje się być czymś, co Mock powinien wykonywać automatycznie. Czy istnieje inna metoda robienia tego, czego mi brakuje? A może mój ostatni przykład jest najlepszym sposobem na zrobienie tego?

Odpowiedz

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

Out: 1

x() 

Out: 2

Połóż odpowiedzi na na liście. Zmień X, aby uzyskać żądaną nazwę.

+0

nie mam pojęcia, co ci chodzi tutaj. Wydaje się, że w ogóle nie dotyczy to pytania i wygląda na skomplikowany sposób zapisu 'x = [1, 2] .__ iter __(). Next'. Co próbujesz powiedzieć? – aquavitae

+0

dobrze. Chcesz znaleźć sposób na pozorowanie funkcji. Teraz kolejność odpowiedzi. Nie? x = ["Twoja pierwsza odpowiedź", "Twoje drugie wydanie", "... itd."] .__ iter __(). Next Rozwiązuje problem. – Nasgar

+0

Wiem, jak utworzyć iterator i wyśmiać funkcję. Moje pytanie brzmiało, czy istnieje łatwy sposób na zresetowanie próbnego dla każdej funkcji testowej. – aquavitae

1

Trzeba tylko zastosować poprawkę do każdego testu, zamiast stosowania go do klasy:

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 
Powiązane problemy