2013-04-17 12 views
11

Pierwszy raz za pomocą łaty. Próbowałem załatać jedną z moich klas do testów. Bez plastra próby uruchomienia dostaje obok definicji funkcji testowej, ale z plastra definicja funkcja testu najwyraźniej wymaga innego parametru, a ja dostajęŁata - Poprawianie klasy wprowadza dodatkowy parametr?

TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given) 

błąd. Kod testowy jest następujący:

import unittest 
import mock 
from notification.models import Channel, addChannelWithName, deleteChannelWithName 

class TestChannel(unittest.TestCase): 
    @mock.patch('notification.models.Channel') 
    def testAddChannelWithNamePutsChannel(self): 
     addChannelWithName('channel1') 
     Channel.put.assert_called_with() 

Dlaczego wymaga dodatkowego parametru z łatką i jaki powinien być ten parametr? Dziękuję bardzo!

+2

Spróbuj użyć 'self, * args' zamiast tylko' self' i wydrukuj 'args'. –

Odpowiedz

6

przekazuje naprawiony obiekt do funkcji testu. Jego udokumentowane here:

poprawkę jako funkcję dekoratora, tworząc makiety dla ciebie i przepuszczenie go do zdobione funkcję:

>>> 
>>> @patch('__main__.SomeClass') 
... def function(normal_argument, mock_class): 
...  print(mock_class is SomeClass) 
... 
>>> function(None) 
True 
23

patch przechodzi w instancji połatany obiektu do testu metoda (lub każda metoda testu, jeśli łatasz na poziomie klasy). Jest to przydatne, ponieważ pozwala ustawić wartości zwracanych i skutki uboczne, lub sprawdzić połączenia wykonane

@patch('some_module.sys.stdout') 
def test_something_with_a_patch(self, mock_sys_stdout): 
    mock_sys_stdout.return_value = 'My return value from stdout' 

    my_function_under_test() 

    self.assertTrue(mock_sys_stdout.called) 
    self.assertEqual(output, mock_sys_stdout.return_value) 

Jeśli chcesz po prostu dosłownie załatać coś go zignorować to można nazwać poprawkę z następującym wezwaniem

@patch('some_module.sys.stdout', Mock()) 
def test_something_with_a_patch(self): 

To zastępuje sys.stdout w some_module obiektem próbnym i nie przekazuje go do metody.

Powiązane problemy