2013-06-17 11 views
5

Jaki jest właściwy sposób używania nosa.tools i utrzymanie powodzenia u szczytu?Narzędzia do pielęgnacji nosa i pylinta

Poniższy kod:

''' 
This is a test 
''' 

import nose.tools 
import nose.tools.trivial 

nose.tools.assert_equal(1, 1) 
nose.tools.assert_equals(1, 1) 

nose.tools.trivial.assert_equal(1, 1) 
nose.tools.trivial.assert_equals(1, 1) 

Wyniki w następujących błędów pylint:

$ pylint -i y -r n /tmp/aseq.py 
************* Module aseq 
E1101: 8,0: Module 'nose.tools' has no 'assert_equal' member 
E1101: 9,0: Module 'nose.tools' has no 'assert_equals' member 
E1101: 11,0: Module 'nose.tools.trivial' has no 'assert_equal' member 
E1101: 12,0: Module 'nose.tools.trivial' has no 'assert_equals' member 

Oczywiście, można wyłączyć E1101, czy istnieje przejrzysty sposób?

Odpowiedz

2

nose.tools.trivial prostu sprawdza unittest.TestCase klasę w locie i sprawia, że ​​wszystko "publiczne" metody począwszy od assert dostępnym nose.tools lub nose.tools.trivial:

nos/Narzędzia/__ init__.py:

from nose.tools.nontrivial import * 
from nose.tools.nontrivial import __all__ as nontrivial_all 
from nose.tools.trivial import * 
from nose.tools.trivial import __all__ as trivial_all 

__all__ = trivial_all + nontrivial_all 

nos/tools /trivial.py:

... 

class Dummy(unittest.TestCase): 
    def nop(): 
     pass 
_t = Dummy('nop') 

for at in [ at for at in dir(_t) 
      if at.startswith('assert') and not '_' in at ]: 
    pepd = pep8(at) 
    vars()[pepd] = getattr(_t, at) 
    __all__.append(pepd) 

... 

pylint nie może obsłużyć tej "hacky" zachowanie.

Rozważ użycie nose.tools.eq_ zamiast assert_equal i assert_equals (te metody są w rzeczywistości takie same). Nadzieja, która pomaga.

+0

To jest dobry wgląd. Chociaż wygląda na to, że w 'nose/tools/trivial.py'" pep8 "wersje unittestowych implementacji' assertEqual'/'assertEquals' są dołączane jako' assert_equal'/'assert_equals' itd. Ale' assertEqual' i ' assertEquals's nie są dodawane. nose.tools zapewnia własną implementację 'eq_', różną od implementacji unittest (chociaż oba mają być takie same). – user650654

+0

Oczywiście, dobry punkt, miałem na myśli 'assert_equal' i' assert_equals'. Tak, 'eq_' działa nieco inaczej niż' assertEqual/assertEquals' metody 'unittest.TestCase'. – alecxe

4

Zamiast wyłączania E1101, należy umieścić:

ignored-classes=nose.tools,nose.tools.trivial 

w .pylintrc, w sekcji [TYPECHECK].

Tak jak jest w wersji pylint doc, opcja ta jest "przydatna w przypadku klas z dynamicznie ustawionymi atrybutami".

+1

To brzmi jak powinno, ale pylint wciąż rzuca ten sam błąd. czego mi brakuje? Używam nosetests wersji 1.3.0. –

+0

Po prostu próbuję w virtualenv z python = 2.7.4, nose = 1.3.0 i pylint = 1.0.0, z rcfile uzyskać przez 'pylint --generate-rcfile': nie więcej E1101 kiedy umieszczam' ignored- classes' w pliku rc. Czy możesz spróbować tego samego? –

1

Pylint nie rozumie magii ukrytej w nosie. Zgodnie z sugestiami rozwiązania obejmują wyłączanie E1101 lub ignorowanie powiązanych klas. Ale najlepiej jest przyczynić się do pylint-brain project, przesyłając tam prosty opis części API nie uchwyconej przez Pylint. Powinno to być całkiem proste z dokumentu i przykładu, który tam znajdziesz.

+0

hmm, ten link wydaje się być martwy. – user650654

+0

@ user650654 w rzeczy samej, użyj https://bitbucket.org/logilab/pylint-brain zamiast tego – sthenault

+0

Brzmi jak dobry pomysł, ale potrzebuję instalacji pip, aby użyć tego w produkcji. Jakieś plany wydania wersji do pip? –

0

Korzystanie pylint 1.4.3 (z astroid 1.3.6, wspólny 0.63.2, Python 2.7.10), ustawienie, które ma zostać zmienione jest ignored-modules, a nie ignored-classes:

ignored-modules=nose.tools,nose.tools.trivial