Le librerie client Google Cloud per Rust forniscono helper che semplificano l'interazione con le operazioni a lunga esecuzione (LRO). La simulazione del comportamento delle LRO nei test delle unità implica la comprensione dei dettagli sottostanti che questi helper astraggono. Questa guida mostra come scrivere test delle unità per il polling LRO automatico e manuale, inclusi gli scenari di errore.
Prerequisiti
Questa guida presuppone che tu abbia familiarità con le seguenti guide:
Testa il polling automatico
Supponiamo che il codice dell'applicazione attenda lro::Poller::until_done() (polling automatico):
Poiché l'applicazione utilizza solo il risultato finale dell'LRO, non è necessario testare il modo in cui gestisce i risultati di polling intermedi. Il test può restituire il risultato finale dell'LRO direttamente dal mock.
Crea il longrunning::model::Operation
Supponiamo che tu voglia che la chiamata restituisca la seguente risposta:
Lo stub restituisce un longrunning::model::Operation anziché un BatchRecognizeResponse. Inserisci la risposta prevista in Operation::result:
Imposta il campo done su true per indicare a Poller che l'operazione è completata, terminando il ciclo di polling:
Scrivi il test
Definisci la struttura fittizia, che implementa il tratto
speech::stub::Speech:Nel test, crea il mock e imposta le aspettative:
Crea un client dal mock, chiama la funzione e verifica la risposta:
Testa il polling manuale con i metadati intermedi
Supponiamo che il codice dell'applicazione esegua il polling manualmente ed elabori gli aggiornamenti parziali:
Puoi simulare il comportamento dell'applicazione quando riceve metadati intermedi restituendo operazioni in corso dal mock.
Crea longrunning::model::Operation
L'RPC BatchRecognize restituisce risultati parziali come speech::model::OperationMetadata. Inserisci questi metadati nel campo Operation::metadata dell'oggetto longrunning::model::Operation restituito:
Scrivi il test
Definisci la struttura fittizia, che implementa il tratto
speech::stub::Speeched esegue l'override diget_operation():Nel test, crea il mock e imposta le aspettative in modo che restituisca risultati parziali (25%, 50%, 75%) seguiti dal risultato finale:
Tieni presente i seguenti dettagli su come sono configurate le aspettative:
- RPC iniziali e successive: la prima aspettativa è impostata su
batch_recognize(), mentre tutte le aspettative successive sono impostate suget_operation(). La RPCBatchRecognizeiniziale avvia l'LRO sul server e restituisce un identificatore dell'operazione nel camponame(omesso dal codice di test per brevità). Da quel momento in poi, la libreria client esegue il polling dello stato di quell'LRO utilizzando l'RPCGetOperation. - Ordine delle chiamate: le aspettative vengono registrate in un
Sequence. In questo modo,mockallpuò verificare l'ordine delle chiamate e determinare quale aspettativaexpect_get_operationcorrisponde a ogni sondaggio.
- RPC iniziali e successive: la prima aspettativa è impostata su
Crea un client dal mock, chiama la funzione e verifica la risposta:
Simula errori
Gli errori possono verificarsi in diversi punti durante un'operazione LRO.
Se la tua applicazione utilizza il polling automatico, tutte le origini degli errori sono equivalenti:
until_done() restituisce l'errore in Result, indipendentemente dalla sua origine.
La simulazione di un errore durante l'avvio di un'operazione LRO
produce il test più semplice.
Simula un errore durante l'avvio di un'operazione a lunga esecuzione (LRO)
Per simulare un errore durante l'avvio di un'operazione LRO, configura la richiesta iniziale in modo che non vada a buon fine con un errore:
Per il polling manuale, il ramo PollingResult::Completed riceve l'errore
dall'avvio dell'LRO, che termina il ciclo di polling:
Simula un'operazione LRO che genera un errore
Per simulare un'LRO che non va a buon fine dopo aver restituito metadati intermedi, restituisci l'errore nel longrunning::model::Operation finale:
Definisci le aspettative per la restituzione del Operation non riuscito da get_operation:
Nel polling manuale, il ramo PollingResult::Completed riceve il risultato dell'errore, terminando il loop di polling:
Simula un errore di polling
I loop di polling possono anche terminare quando la policy di polling è esaurita. In questo caso, la libreria client non può determinare in modo definitivo se l'LRO è stato completato.
Se la tua applicazione ha una logica personalizzata per gestire gli errori di polling, puoi testarla
restituendo un errore direttamente dall'aspettativa get_operation:
Nel polling manuale, il ramo PollingResult::PollingError riceve l'errore di polling simulato:
Codice di test completo
Le sezioni seguenti mostrano il codice completo per i test descritti in questa guida.