2015-02-25 7 views
6

Uczę się, jak testowanie odbywa się w Pythonie za pomocą py.test. Próbuję przetestować konkretną sytuację, która jest dość powszechna podczas korzystania z innych bibliotek, takich jak mock. W szczególności testowanie, że funkcja lub metoda wywołuje inny wywoływacz z poprawnymi argumentami. Nie jest wymagana żadna wartość zwracana, tylko potwierdzenie, że testowana metoda prawidłowo wywołuje wywołanie.Jak przetestować funkcję jest wywoływana z poprawnymi argumentami z pytest?

Oto przykład prosto z docs:

>>> class ProductionClass: 
...  def method(self): 
...   self.something(1, 2, 3) 
...  def something(self, a, b, c): 
...   pass 
... 
>>> real = ProductionClass() 
>>> real.something = MagicMock() 
>>> real.method() 
>>> real.something.assert_called_once_with(1, 2, 3) 

Czy można to zrobić przy użyciu monkeypatch lub fixtures od py.test, bez skutecznie pisać własne szydzili klasę? Szukałem tego konkretnego przypadku użycia, ale nie mogłem znaleźć przykładu. Czy py.test zachęca do alternatywnego sposobu wykonywania kodu w ten sposób?

+0

Dziwne, że taka podstawowa funkcjonalność do testowania jednostek nie jest wyjęta z pudełka. –

Odpowiedz

1

Dobrze. Mam wymyślić coś, co wydaje się działać, ale przypuszczam, że jego podobna do makiety:

@pytest.fixture 
def argtest(): 
    class TestArgs(object): 
     def __call__(self, *args): 
      self.args = list(args) 
    return TestArgs() 

class ProductionClass: 
    def method(self): 
     self.something(1,2,3) 
    def something(self, a, b, c): 
     pass 

def test_example(monkeypatch, argtest): 
    monkeypatch.setattr("test_module.ProductionClass.something", argtest) 
    real = ProductionClass() 
    real.method() 
    assert argtest.args == [1,2,3] 
+0

Jak możemy połączyć to podejście z kpiącą wartością zwrotu? –

3

Można użyć pytest-mock co sprawia, że ​​jest łatwy w użyciu pakiet mock jako urządzenia pytest.

Powiązane problemy