Prova un wrapper su statico / singleton esterno

1

Sto integrando una libreria esterna che dichiara un singleton, come questo:

public class External : MonoBehaviour {
    public static External Instance { get {/*setup inner stuff*/} }

    public void Method1(int arg);
    ...
    public bool MethodN(): // N is large
}

Ho creato un wrapper con un'interfaccia, quindi posso testare il resto del mio codice.

Mi chiedo se ci sia un modo semplice per testare / verificare che il mio wrapper sia cablato correttamente, cioè ogni metodo chiama il metodo wrapped, inoltra i parametri e restituisce il risultato (se non vuoto). per esempio:.

public class ApiWrapper : IExernalAPI {
    public void Method1(int arg) {
        External.Instance.Method1(arg);
    }
    ...
    public bool MethodN() {
        return External.Instance.MethodN();
    }
}

questa classe dovrebbe essere "testata"? se sì, come?

    
posta M R 21.03.2017 - 12:26
fonte

2 risposte

0

La ragione per cui stai creando questo wrapper (non essere in grado di stubare il singleton) è proprio la ragione per cui non puoi facilmente testare il wrapper stesso in modo isolato.

Per un involucro banale come questo una revisione del codice è un'alternativa adatta a un test automatico. Tutti gli errori sono facilmente individuabili e l'unica ragione del cambiamento (e di conseguenza il dover fare un'altra revisione) è un cambiamento nell'interfaccia del singleton.

Se N o la frequenza delle modifiche all'interfaccia Singleton sono molto grandi, puoi anche considerare di scrivere un generatore per generare il wrapper dall'interfaccia Singleton. Dovresti confrontare la stima dello sforzo e la qualità di output del generatore rispetto a quella delle revisioni del codice per vedere quale opzione ha più senso.

In breve: no, invece di testare il wrapper unitario, generarlo o fare affidamento su revisioni del codice.

    
risposta data 19.08.2017 - 13:09
fonte
0

A mio avviso, il modo più semplice per testare qualcosa del genere sarebbe testare se il wrapper fa la stessa cosa del singleton. Questo potrebbe essere molto difficile da testare se il singleton finisce per trasportare molto stato, ma sapendo che un certo insieme di parametri produrrebbe lo stesso risultato se il singleton viene chiamato direttamente o il wrapper viene chiamato.

Ciò che sembra preoccupante è il fatto che l'interfaccia che hai creato serve solo come un wrapper che mi farebbe dubitare del perché l'interfaccia possa trarne beneficio (ignorando il fatto che fornisce test più semplici quando puoi simulare l'interfaccia). Preferirei passare da un semplice wrapper a qualcosa che agisce un po 'più come un adattatore. I tuoi casi d'uso sarebbero probabilmente diversi dal semplice chiamare ciascuno dei metodi direttamente dove in questo caso puoi probabilmente modellare le tue interazioni con il singleton in modo tale che potrebbe essere più semplice verificare che, dato un determinato insieme di parametri, garantirà che viene restituito l'output corretto invece di voler solo verificare che siano stati chiamati i metodi corretti.

D'altra parte un test di integrazione di alto livello potrebbe servire a raccogliere se il wrapper è impostato correttamente, ma è un grande gioco di dare e avere.

    
risposta data 20.06.2017 - 09:05
fonte

Leggi altre domande sui tag