Estou tentando usar o pacote simulado Pythons para simular o requests
módulo Pythons . Quais são as ligações básicas para que eu trabalhe no cenário abaixo?
No meu views.py, tenho uma função que faz várias chamadas orders.get () com respostas diferentes a cada vez
def myview(request):
res1 = requests.get('aurl')
res2 = request.get('burl')
res3 = request.get('curl')
Na minha classe de teste, quero fazer algo assim, mas não consigo descobrir exatamente as chamadas de método
Passo 1:
# Mock the requests module
# when mockedRequests.get('aurl') is called then return 'a response'
# when mockedRequests.get('burl') is called then return 'b response'
# when mockedRequests.get('curl') is called then return 'c response'
Passo 2:
Chamar minha opinião
Etapa 3:
verificar se a resposta contém 'uma resposta', 'b resposta', 'c resposta'
Como concluir a Etapa 1 (zombando do módulo de solicitações)?
Respostas:
É assim que você pode fazer (você pode executar este arquivo como está):
Nota importante: Se a sua
MyGreatClass
classe mora em um pacote diferente, digamosmy.great.package
, você precisa zombar emmy.great.package.requests.get
vez de apenas 'request.get'. Nesse caso, seu caso de teste ficaria assim:Aproveitar!
fonte
from unittest import mock
porimport mock
e o resto funciona como está. Você precisa instalar omock
pacote separadamente.mock_requests_get
necessário parayield
, em vez dereturn
por causa da mudança para voltar iterators em Python 3.Tente usar a biblioteca de respostas :
fornece uma conveniência bastante agradável ao configurar toda a zombaria de si mesmo
Há também HTTPretty :
Não é específico para a
requests
biblioteca, é mais poderoso em alguns aspectos, embora eu ache que não se presta tão bem para inspecionar os pedidos que interceptou, o queresponses
é bastante fácilHá também um resetmock .
fonte
responses
corresponder a um URL curinga - ou seja, implemente a lógica de retorno de chamada como "pegue a última parte do URL, procure-o em um mapa e retorne o valor correspondente". Isso é possível e só estou sentindo falta disso?request
arg recebido pela função de retorno de chamada)Aqui está o que funcionou para mim:
fonte
from unittest import mock
. docs.python.org/3/library/unittest.mock.htmlEu usei orders-mock para escrever testes para o módulo separado:
E os testes:
fonte
é assim que você zomba de orders.post, altera para o método http
fonte
mockresponse.json = lambda: {'key': 'value'}
mockresponse.json.return_value = {"key": "value"}
Se você quiser zombar de uma resposta falsa, outra maneira de fazer isso é simplesmente instanciar uma instância da classe base HttpResponse, da seguinte maneira:
fonte
HttpResponse
, em vez de ... Base, fez o truque para mim. Obrigado!Uma maneira possível de contornar solicitações é usar a biblioteca betamax, ela registra todas as solicitações e, depois disso, se você fizer uma solicitação no mesmo URL com os mesmos parâmetros, a betamax usará a solicitação gravada, eu a uso para testar o rastreador da Web e isso me poupa muito tempo.
https://betamax.readthedocs.io/en/latest/
fonte
Apenas uma dica útil para aqueles que ainda estão lutando, convertendo de urllib ou urllib2 / urllib3 em solicitações E tentando zombar de uma resposta - eu estava recebendo um erro um pouco confuso ao implementar meu mock:
with requests.get(path, auth=HTTPBasicAuth('user', 'pass'), verify=False) as url:
Bem, é claro, se eu soubesse alguma coisa sobre como
with
funciona (não sabia), saberia que era um contexto vestigial e desnecessário (do PEP 343 ). Desnecessário quando usando a biblioteca pedidos porque ele faz basicamente a mesma coisa para você sob o capô . Basta removerwith
e usar o nurequests.get(...)
e Bob é seu tio .fonte
Adicionarei essas informações, já que tive dificuldade em descobrir como zombar de uma chamada de API assíncrona.
Aqui está o que eu fiz para zombar de uma chamada assíncrona.
Aqui está a função que eu queria testar
Você ainda precisa da classe MockResponse
Você adiciona a classe MockResponseAsync
Aqui está o teste. O importante aqui é que eu criei a resposta antes, já que a função init não pode ser assíncrona e a chamada para getResponse é assíncrona, portanto tudo foi verificado.
Se você tem uma maneira melhor de fazer isso, me diga, mas acho que é bem limpo assim.
fonte