2015-05-27 11 views
7

Ho una classe di test per testare i miei metodi ma ho qualche problema con il passaggio di sé, entrambi sono all'interno della classe e della classe di test.metodi di classe chiamata pytest test class, l'errore di tipo richiede esattamente 2 argomenti (1 dato)

il mio metodo:

def get_all_links(self): 
    """return all the links inside an html 

    :return: list of links from an html page 
    :rtype: list 
    """ 
    return self.html.find_all('a') 

mio banco di prova:

@parameterized.expand(["http://www.google.com", "http://www.walla.com"]) 
    def test_get_all_links_known_links(self, known_link): 
     """check get_all_links with a known link list 

     :param known_link: lick to find 
     :type known_link: str 
     """ 
     html = Parser(open(os.path.normpath(os.path.join(self.root, "test.html")))) 

     self.assertTrue(any([known_link in str(l) for l in html.get_all_links()])) 

errore:

E TypeError: test_get_all_links_known_links() takes exactly 2 arguments (1 given) 

/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py:329: TypeError 
... 
+2

realtà; stai usando [naso] (https://nose.readthedocs.org/en/latest/) o pytest? Il titolo della domanda implica [pytest] (https://pytest.org) - Anche il tuo tag include '' pytest''. -- Cos'è questo? –

+0

@James Mills Sto usando pytest ma sto provando ad usare il nose parametrizzato con esso. –

+1

No; usa la parametrizzazione e le attrezzature di pytest :) Per favore! Non complicare le cose con due framework di test! –

risposta

4

È davvero non c'è bisogno di creare una sottoclasse unittest.TestCase qui:

È anche possibile test "parametize" utilizzando pytest così:

Esempio:

import pytest 


from app.objects import Root # Example 


known_links = [ 
    "http://www.google.com", 
    "http://www.walla.com" 
] 


@pytest.fixture() 
def root(request): 
    return Root() # Root object 


@pytest.mark.parametrize("known_links", known_links) 
def test_get_all_links_known_links(root, known_link): 
    html = Parser(
     open(os.path.normpath(os.path.join(root, "test.html"))) 
    ) 

    assert any([known_link in str(l) for l in html.get_all_links()]) 

See:

0

aggiungere self. davanti html.get_all_links

self.assertTrue(any([known_link in str(l) for l in self.html.get_all_links()])) 

Python deve essere in grado di trovare il metodo nello spazio dei nomi. Attraverso self (cioè l'istanza dell'oggetto) può trovare tutte le voci nello spazio dei nomi dell'istanza e tutte le voci nel suo spazio dei nomi della classe, ecc. Vedere here per informazioni su classi/metodi/attributi/spazi dei nomi. vedere anche la mia risposta a un problema simile here

+2

Non c'è "self.html'' nel codice di esempio precedente. –

+0

La tua "modifica" non è di gran lunga migliore IHMO e confusa. Almeno mostra un esempio di * cosa potrebbe accadere *. –

2

è necessario importare parameterized prima di utilizzare il decoratore:

from nose_parameterized import parameterized 
+0

Oh ah ah non ho notato che l'OP stava usando il nodo e non pytest :) Whoops! Hmm in realtà non sono sicuro ora :) –

+0

Sì, anche se, in realtà, poteva usare sia il naso che l'unittest. Dai un'occhiata a questi esempi: https://github.com/wolever/nose-parameterized – chown

+0

Oh bene * shrug *; l'OP non ha risposto ai nostri commenti quindi chiamiamolo * due possibili soluzioni *) :) –

Problemi correlati