Esiste un modo più semplice per testare extras_require

1

Ho codice revisionato un pezzo di codice Python, ma per me sembra davvero brutto, hacky e complesso per qualcosa che può essere raggiunto molto facilmente.

Il codice ha un aspetto simile al seguente:

_extra.py (questo dovrebbe essere un modulo privato a causa del carattere di sottolineatura):

import dependency

class Extra(dependency.Cls):
    ...

setup.py

setup(
    ...
    name='somepkg',
    extras_require={
        ...
        'extra': ['dependency']})

public.py

_dist = pkg_resources.working_set.find(
    pkg_resources.Requirement.parse('somepkg'))

if 'extra' in _dist:
    from _extra import Extra

In modo che extras_require possa essere testato usando:

class ExtraTest(unittest.TestCase):
    ...
    # Some test cases where the requirement actually is available

    def test_require_extra(self):
        dist = mock.Mock(pkg_resources.Distribution)
        self.dist.extras = []
        public = helper.import_or_reload('public')
        with self.assertRaises(AttributeError):
            public.Extra

Il mio pensiero iniziale sarebbe di non avere _extra.py esistente e avere public.py come:

try:
    import dependency
except ImportError
    pass
else:
    class Extra(dependency.Cls):
        ...

Non mi interessa davvero che non sia testato che non possa essere importato se non è in extras_require .

Il codice originale sembra una soluzione logica?
Il extras_require dovrebbe essere testato in qualche modo? Se sì, come?

    
posta Remco Haszing 03.10.2014 - 19:07
fonte

1 risposta

2

Se tutto ciò è fatto solo per rendere possibile il test della classe Extra , allora il codice sta complicando le cose. Il codice chiede il permesso piuttosto che il perdono.

Hai ragione, cambiare il codice per catturare l'eccezione ImportError semplificherebbe enormemente il codebase.

Il codice non dovrebbe nemmeno provare a testare il rilevamento, ma semplicemente fare affidamento sui test di unità di Python per aver provato a lanciare un ImportError correttamente. Nel migliore dei casi l'unittest dovrebbe verificare cosa succede se extra non è impostato (forse con l'impostazione del codice extra = None se la dipendenza è mancante, il test è facile come il mocking extra = None ).

    
risposta data 06.10.2014 - 10:31
fonte

Leggi altre domande sui tag