Devo gettare ArgumentNullException e dovrei testarlo? [duplicare]

-1

Facciamo un esempio di classe con 3 dipendenze e un metodo.

class Example
{
    private readonly IDependency1 _d1;
    private readonly IDependency2 _d2;
    private readonly IDependency3 _d3;

    public Example(IDependency1 d1, IDependency2 d2, IDependency3 d3)
    {
        _d1 = d1 ?? throw new ArgumentNullException(nameof(d1));
        _d2 = d2 ?? throw new ArgumentNullException(nameof(d2));
        _d3 = d3 ?? throw new ArgumentNullException(nameof(d3));
    }

    public string Method(string parameter)
    {
        if(parameter == null)
            throw new ArgumentNullException(nameof(parameter));

        return ...
    }
}

TDD suggerisce di testare praticamente tutto. Quindi ci dovrebbero essere 3 test che si aspettino ArgumentNullException per ogni dipendenza del costruttore. Inoltre un test per il metodo quando il parametro passato è nullo. Questi test non mi sembrano molto vantaggiosi e richiedono una quantità di tempo non nulla. Quindi la mia domanda è. Vale veramente la pena testare per ArgumentNullExceptions?

L'altra domanda è. Quando sono utili a tutti questi controlli? Non sarebbe meglio avere solo la documentazione che dice che i parametri metodo / costruttore passati non devono essere nulli? E non è ovviamente per quanto riguarda le dipendenze dal costruttore? E l'altro problema è: supponiamo che chiamo metodi come questo in un sistema funzionante testato . Questi controlli non rallenterebbero inutilmente le cose (supponendo che praticamente ogni metodo controlli gli argomenti nulli)?

    
posta Patrik Bak 13.12.2017 - 17:05
fonte

2 risposte

4

Is it really worth it to test for ArgumentNullExceptions?

Certo, se vuoi assicurarti che funzionino correttamente. Detto questo, Non eseguire il test del codice triviale unitario

When are these checks beneficial at all?

Assicurano l'integrità del tuo sistema impedendo la creazione di oggetti non validi.

Wouldn't it be better to have just documentation saying that passed method / constructor parameters must not be null?

Perché testare la validità di qualcosa, allora? Stai dicendo di documentare solo le condizioni valide e spero che l'utente legga la documentazione e faccia tutto correttamente?

And isn't that obviously with regards to dependencies to constructor?

Lo scopo di lanciare qualsiasi eccezione in un costruttore è di informare il chiamante che: Non posso costruire un oggetto valido perché non mi hai fornito ciò che devo fare.

Wouldn't these checks unnecessarily slow things down?

Il costo è incredibilmente piccolo rispetto al vantaggio.

    
risposta data 13.12.2017 - 17:24
fonte
0

È davvero noioso e, senza dubbio uno spreco di tempo, scrivere questi test banali e non super utili a mano. Se lo ritieni necessario (controlla l'articolo citato prima da @Robert Harvey)

Considera di scrivere un codice che verificherà automaticamente i casi null .

Ad esempio, in Java, è possibile utilizzare la reflection e inviare un singolo argomento null a un elenco di metodi della classe, ad esempio Method() . Per i metodi e i costruttori multi-argomento è un po 'più complicato, ma può farlo eseguendo il loop degli argomenti, (magari con un'opzione per ignorarne alcuni)

Ignorando questo problema nullo, puoi fare lo stesso per getter / setter generici semplici senza convalida . Imposta una stringa casuale, un numero intero, ecc., Recuperalo e verifica l'uguaglianza.

    
risposta data 13.12.2017 - 17:52
fonte

Leggi altre domande sui tag