2015-02-25 13 views
6

Sto imparando come viene eseguito il test in Python utilizzando py.test. Sto provando a testare una situazione specifica che è abbastanza comune quando si usano altre librerie come mock. In particolare, verifica che una funzione o un metodo invochi un altro callable con gli argomenti corretti. Non è necessario alcun valore di ritorno, solo una conferma che il metodo in prova effettua correttamente la chiamata.Come testare la funzione viene chiamata con gli argomenti corretti con pytest?

Ecco un esempio direttamente dalla 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) 

E 'possibile farlo utilizzando monkeypatch o fixtures da py.test, senza scrivere in modo efficace la mia stessa classe deriso? Ho cercato questo caso d'uso specifico, ma non ho trovato un esempio. py.test incoraggia un modo alternativo di esercitare un codice come questo?

+0

Strano che tale funzionalità di base per il test dell'unità non sia immediata. –

risposta

1

Bene. Mi è venuta in mente una cosa che sembra funzionare, ma suppongo che il suo simile per finta:

@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

Come possiamo combinare questo approccio con il valore di ritorno derisorio? –

3

È possibile utilizzare pytest-mock che lo rende facile da usare il pacchetto mock come un appuntamento fisso pytest.

Problemi correlati