Um dingus é como um objeto simulado. A principal diferença é que você não configura as expectativas antes do tempo. Você acabou de executar seu código, usando um dingus no lugar de outro objeto ou classe, e ele gravará o que acontece com ele. Então, depois que seu código for exercido, você poderá fazer afirmações sobre o que ele fez com o Dingus.
Um novo Dingus é criado a partir da classe Dingus. Você pode dar aos nomes de dingutes, o que ajuda a depurar seus testes, especialmente quando há vários dingus em jogo.
>>> from dingus import Dingus >>> d = Dingus( ' root ' ) >>> d <Dingus root>
O acesso a qualquer atributo de um dingus retornará um novo Dingus.
>>> d.something <Dingus root.something>
Existem algumas exceções para os métodos especiais de Dingus. Veremos alguns daqui a pouco.
Um dingus também pode ser chamado como uma função ou método. Não se importa com quantos argumentos você dá ou quais são esses argumentos. As chamadas para um dingus sempre retornarão o mesmo objeto, independentemente dos argumentos.
>>> d() <Dingus root()> >>> d( ' argument ' ) <Dingus root()> >>> d( 55 ) <Dingus root()>
A qualquer momento, podemos obter uma lista de chamadas que foram feitas para um dingus. Cada entrada na lista de chamadas contém:
Aqui está uma lista das ligações que fizemos para D até agora:
>>> from pprint import pprint >>> pprint(d.calls) [('()', (), {}, <Dingus root()>), ('()', ('argument',), {}, <Dingus root()>), ('()', (55,), {}, <Dingus root()>)]
Você pode filtrar chamadas por nome, argumentos e argumentos de palavras -chave:
>>> pprint(d.calls( ' () ' , 55 )) [('()', (55,), {}, <Dingus root()>)]
Se você não se importa com o valor de um argumento específico, poderá usar o valor do Dontare ao filtrar:
>>> from dingus import DontCare >>> pprint(d.calls( ' () ' , DontCare)) [('()', ('argument',), {}, <Dingus root()>), ('()', (55,), {}, <Dingus root()>)]
Os Dingus podem fazer mais do que apenas atributos acessados e chamados. Eles apóiam muitos operadores de Python. O objetivo é permitir e registrar qualquer interação:
>>> d = Dingus( ' root ' ) >>> ( 2 ** d.something)[ ' hello ' ]() / 100 * ' foo ' <Dingus root.something.__rpow__[hello]().__div__.__mul__>
(Espero que suas gravações de Dingus do mundo real não pareçam assim!)
O DINGUS fornece um gerente de contexto para corrigir objetos durante os testes. Por exemplo:
>>> from dingus import patch >>> import urllib2 >>> with patch( ' urllib2.urlopen ' ): ... print urllib2.urlopen. __class__ <class 'dingus.Dingus'> >>> print urllib2.urlopen. __class__ <type 'function'>
Você também pode usar isso como decorador em seus métodos de teste:
>>> @ patch( ' urllib2.urlopen ' ) ... def test_something ( self ): ... pass ...
O oposto do patch é isolado. Ele remende tudo, exceto o objeto nomeado:
>>> from dingus import isolate >>> @ isolate( ' urllib2.urlparse ' ) ... def test_urlparse ( self ): ... pass ...
Quando este teste for executado, tudo no módulo URLLIB2, exceto o URLPARSE, será um dingus. Observe que isso pode demorar a executar se o módulo contiver muitos objetos; Patches de desempenho são bem -vindos. :)
O Dingus também pode substituir automaticamente os globais de um módulo ao executar os testes. Isso permite que você escreva testes de unidade totalmente isolados. Consulte exemplos/urllib2/test_urllib2.py por exemplo. O autor não recomenda mais esse recurso, pois pode incentivar testes muito quebradiços. Você deve sentir a dor de zombar manualmente dependências; A dor lhe dirá quando uma classe colabora com muitos outros.