2013-08-06 9 views
5

Używam Mock do zamiany metody z klasy na konkretną wartość zwracaną. Działa to bardzo dobrze, może trochę zbyt dobrze ... Robię to (patrz poniżej), ale w następnej klasie testowej ponownie używam klasy haseł bez szyderstwa, a sztuczka umieszczona w tym teście jest nadal skuteczna.Metoda cofania Pythona

from utils import password as pass_helper 

class TestPassword(unittest.TestCase): 
    def setUp(self): 
     self.username = "user" 
     self.password = "Test_1234_pass" 
     pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

    def test_password(self): 
     password = pass_helper._get_password_from_keyboard(self.username) 
     self.assertEqual(password, self.password) 

Próbowałem cofnąć próbę w metodzie TearDown, robiąc coś takiego, ale to nie działa.

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Jak mogę przywrócić pierwotną funkcjonalność metody klasy?

Odpowiedz

3

Problem, ponieważ wygląda na to, że się zebrałeś, polega na tym, że wprowadzone zmiany nie ograniczają się do zakresu testu, ale zamiast tego są przeklejane do innych testów (co jest oczywiście dużym problemem podczas testowania urządzenia) . Twój pomysł odwrócenia zmiany w swoim sposobie teardown jest dobry, jednak problemem jest to, że są ponownie przypisując mock wersji metody z powrotem do siebie, kiedy to zrobić:

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Coś jak to powinno praca, gdzie przed szyderczy sposób przypisać „prawdziwą” wersję metody do zmiennej tymczasowej:

def setUp(self): 
    self.username = "user" 
    self.password = "Test_1234_pass" 
    self.real_get_password_from_keyboard = pass_helper._get_password_from_keyboard 
    pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

def tearDown(self): 
    pass_helper._get_password_from_keyboard = self.real_get_password_from_keyboard 

def test_password(self): 
    password = pass_helper._get_password_from_keyboard(self.username) 
    self.assertEqual(password, self.password) 

nadzieję, że to pomaga!

+0

Wydaje się, że poprawiam mój problem, dzięki! :) – Amaranth

+0

po tym robię, otrzymuję 'niezwiązaną metodę xxx musi być wywołana z instancją xxx jako pierwszym argumentem (zamiast tego int) –

Powiązane problemy