I really am focusing on not writing brittle tests but that still test what need to be tested.
OK, se questo è il tuo obiettivo (ed è buono ...)
Una delle cose che rende i test fragili è che il test diventa accoppiato ai dettagli di implementazione. Le classi sono come un modulo, in quella parte della motivazione per la creazione di una nuova classe è che abbiamo preso una decisione su come la soluzione dovrebbe essere implementata, e vogliamo limitare la quantità di codice che conosce la decisione che abbiamo preso. Vedi sui criteri per essere usato in sistemi di decomposizione in moduli (Parnas, 1982).
In particolare, l'accoppiamento del test a ciò che un comando dovrebbe fare è, da questa prospettiva, rischioso. Cerca invece la query che puoi invocare per confermare che il comando abbia eseguito la cosa prevista.
Ora, hai assolutamente ragione che da qualche parte c'è un po 'di codice che, dati gli input x, y, z, dovrebbe produrre una particolare richiesta http. E vorrete scrivere un test per quel codice (facile - è una domanda). Ma scrivere un test per confermare che A
chiama questa funzione? Yikes.
Un discorso che può essere d'aiuto per il tuo esempio specifico è Confini di Gary Bernhardt. Parte del punto è mantenere il confine sottile; se il codice non sta facendo nulla di sorprendente, allora è facile scriverlo in un modo che è troppo semplice per nascondere un errore. Quando abbiamo bisogno di scrivere test di complicati codici che parlano al confine, possiamo facilmente sostituire un confine reale con i duplicati di test (si pensi a porte e adattatori).
Esistono, naturalmente, alcune strategie per testare le interazioni attraverso un limite del processo. Test del contratto, utilizzando strumenti come Patto , è una possibilità. La mia esperienza è stata che queste strategie sono più costose e quindi si desidera limitarle all'estremità sottile della piramide di test.
Nota: la patch HTTP non è sicura , che è un altro modo per dire che è un " comando". Quindi, nella griglia di Sandi, rientra nel attendi di inviare bucket, con il grandi avvertimenti lettera sulle implicazioni della deriva API.
I "comandi" HTTP sono un po 'confusi, perché restituiscono messaggi e Sandi dice che i comandi non restituiscono nulla? E questo è vero, in un ambiente in cui lo schema CQS ha un senso e hai garanzie di consegna dei messaggi forti. Ma la rete non è affidabile , e hai bisogno di una sorta di riconoscimento per sapere che il messaggio di comando è passato.
Quindi potresti finire con due diversi tipi di test: uno in cui il test double per il client http è un simulato , e tu "prevedi" la richiesta HTTP corretta da inviare, e poi un altro tipo in cui il test double del client http è uno "stub" che restituisce alcune risposte fisse al soggetto del test.
Entrambi questi tipi di test dipendono dal fatto che i duplicati del test rappresentano fedelmente il contratto API tra il client e il server, quindi dovrete stare attenti, in particolare, essere disposti a scartare i test e iniziare sopra se qualcuno introduce una modifica all'indietro incompatibile con quella API.