Frage

Ich habe die folgende Methode Signatur in meinem iterface:

void SetItem(ref AddressItem item);

Ich habe eine Parameterbedingung wie folgt aus:

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

Aber das scheitert, weil der ref. Wenn ich die ref nehmen dann funktioniert es gut. Aber ich muss hier durch Verweis übergeben.

Alle Ideen, wie diese bekommen?

Side Hinweis: Mein Ziel ist es, eine Ausnahme in SetItem zu werfen, wenn die in Wert übergibt null ist. Wenn Sie mit diesem dann erhalten Sie zusätzliche Punkte helfen können!

War es hilfreich?

Lösung

NSubstitute hat keine direkte Unterstützung für arg passende ref Parameter, aber im Allgemeinen wird es mit ihnen in Ordnung zu arbeiten.

Ich werde Sie davon ausgehen müssen, ref verwenden, wie in Ihrer Frage erwähnt, aber offensichtlich, wenn Sie ref Ihre API vermeiden kann einfacher sein, als Wille, es zu testen (unabhängig von den Gerüsten Sie verwenden).

In Antwort auf Ihre unmittelbare Frage, Sie ref durch die Aktualisierung Ihrer zweiten Codebeispiel passieren können:

form.SetItem(ref item);

Für Ihre Seite beachten, stellen Sie sicher, nicht zu viel Verhalten versuchen, in Ihren Ersatz zu schieben. Ich habe festgestellt, dass, wenn ich dies tun es ein Zeichen, ich brauche, ist die Kommunikation zwischen der Klasse Ich teste und ihre Abhängigkeiten zu vereinfachen. (Oder wenn ich wirklich eine Menge Logik in einem falschen Objekt benötigen, werde ich eine Hand-Code anstatt erzeugen sie,. Es oft einfacher sein kann)

Es gibt ein paar Möglichkeiten, diesen Aufruf zu erhalten, eine Ausnahme zu werfen:

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

Dies wird eine Ausnahme nur werfen, wenn sie mit einem Null-ref bezeichnet. Sie können dieses Verhalten auch selektiv hinzufügen je nach Argumente übergeben, obwohl ich abraten würde, da es wahrscheinlich ein Zeichen ist, dass Sie zu viel in Ihren Ersatz drängen.

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

Schließlich, wenn Sie wollen einfach nur prüfen, ob die Klasse, die Sie reagieren richtig zu testen, wenn IAddAddressForm eine arg null Ausnahme auslöst, würde ich wahrscheinlich dies nur tun:

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

Auf diese Weise Sie nicht wirklich egal, was das Argument, Sie wollen einfach nur den Code sicherstellen, dass Sie reagiert richtig auf diesen Fall prüfen.

Hope, das hilft.

SIDE HINWEIS:

Wenn Sie einen arg Matcher verwenden möchten (wie Arg.Any<AddressItem>()) für ein out oder ref Argument werden Sie es sich vor dem Aufruf definieren müssen (dies kann ein bisschen fehleranfällig sein: Sie werden dafür sorgen, müssen Sie festlegen, die Matcher in der gleichen Reihenfolge, wie sie in den Anruf gehen würden):

        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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top