Domanda

Ho il seguente firma del metodo nel mio iterface:

void SetItem(ref AddressItem item);

faccio un vincolo di parametri in questo modo:

IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = null;
form.SetItem(Arg.Is(item));

Ma che non riesce a causa della ref. Se prendo l'arbitro fuori allora funziona benissimo. Ma ho bisogno di passare per riferimento qui.

Tutte le idee come ottenere questo?

Nota a margine: Il mio obiettivo finale è quello di generare un'eccezione nel SetItem se il passato in termini di valore è nullo. Se si può aiutare in questo, allora si ottiene punti extra!

È stato utile?

Soluzione

NSubstitute non ha il supporto diretto per i parametri coordinato art ARG, ma in generale che possa funzionare con loro ok.

ho intenzione di assumere è necessario utilizzare ref che appare nella tua domanda, ma, ovviamente, se si può evitare ref vostra API sarà più semplice, come volontà testarlo (a prescindere dei quadri che si usa).

In risposta alla tua domanda immediata, è possibile passare un ref per l'aggiornamento del secondo esempio di codice a:

form.SetItem(ref item);

Per la vostra nota a margine, assicurarsi che non si sta cercando di spingere troppo il comportamento nel vostro sostituto. Ho scoperto che ogni volta che faccio questo è un bisogno segno che per semplificare la comunicazione tra la classe sto testando e le sue dipendenze. (O se ho davvero bisogno di un sacco di logica in un oggetto falso, io consegno codice di uno piuttosto che generarla;. Spesso può essere più semplice)

Ci sono alcuni modi per ottenere questa chiamata per generare un'eccezione:

form.When(x => x.SetItem(ref item)).Do(x => { throw new ArgumentNullException(); });

Questa un'eccezione solo quando viene chiamato con un rif nullo. È possibile anche aggiungere selettivamente questo comportamento a seconda l'argomento passato, anche se vorrei consigliare contro questo in quanto è probabilmente un segno che si sta spingendo troppo nel vostro sostituto.

form.WhenForAnyArgs(x => x.SetItem(ref item))
    .Do(x => {
        if (x[0] == null)
            throw new ArgumentNullException();
    });

Infine, se si desidera solo per controllare che la classe si sta testando risponde correttamente quando IAddAddressForm genera un'eccezione arg nulla, sarei probabilmente solo fare questo:

form
    .WhenForAnyArgs(x => x.SetItem(ref item))
    .Do(x => { throw new ArgumentNullException(); });

In questo modo non si interessa davvero quello che l'argomento è, si vuole solo assicurarsi che il codice si esegue il test reagisce a questo caso in modo corretto.

Spero che questo aiuti.

Nota a margine:

Se si desidera utilizzare un matcher arg (come Arg.Any<AddressItem>()) per un argomento o out ref sarà necessario definire al di fuori della chiamata stessa (questo può essere un errore di tad soggetto: è necessario assicurarsi che si definisce le matchers nello stesso ordine in cui andranno nella chiamata):

        IAddAddressForm form = Substitute.For<IAddAddressForm>();
        AddressItem item = Arg.Is<AddressItem>(y => y.Number == 14);
        form
            .When(x => x.SetItem(ref item))
            .Do(x => { throw new ArgumentNullException(); });
        var address = new AddressItem { Number = 14 };
        form.SetItem(ref address);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top