Moq mit Objektparameter überprüfen

86

Ich versuche, einen Parameter zu überprüfen, der eine Klasse ist. Der getestete Code ist in Ordnung. Der Fehler ist im Test.

Ich habe zwei Methoden ausprobiert, die beide fehlgeschlagen sind.

Hier sind meine Versuche:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));

Dies schlägt immer fehl, obwohl ein als zweiter Parameter übergebenes Objekt gleiche Eigenschaften hat. Der erste Parameter wird gut verifiziert.

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );

Dies ist immer erfolgreich, auch wenn es fehlschlagen sollte. Die Asserts im Rückruf schlagen fehl, aber die Ausnahme wird nicht an den äußeren Kontext übergeben, und daher besteht der Test immer.

Können Sie mir helfen, herauszufinden, was ich falsch mache?

Rhughes
quelle

Antworten:

138

Der erste Versuch ist näher an dem, was Sie erreichen möchten.

Der Grund dafür ist, dass Moq (wahrscheinlich) Object.Equalsunter dem Deckmantel testet, ob der ImageFilterOptionsParameter, mit dem die Methode aufgerufen wurde, dieselbe Instanz ist wie der, den Sie im Aufruf an angegeben haben Verify.

Es ist unmöglich, dass sie dieselbe Instanz sind, weil in VerifyIhnen eine erstellt wird new ImageFilterOptions().

Anstatt die Parameterprüfung auf diese Weise durchzuführen, können Sie die Moq- It.IsSyntax verwenden, um einen Ausdruck bereitzustellen, der überprüft, ob der Parameter der erwartete war.

In Ihrem Fall möchten Sie überprüfen, ob der Parameter vom Typ ist ImageFilterOptionsund ob sowohl der Widthals auch der auf gesetzt Heightsind 256. Der Ausdruck, mit dem Sie dies tun können, lautet:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)

Ihr Anruf bei Verifykönnte also so aussehen:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
Cristian Lupascu
quelle
1
Die Syntax, die ich verwenden musste, wäre : It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). Es gab kein GenerikumIs
Stanislav
1
Die generische Version funktioniert für mich und befindet sich in den API-Dokumenten ( nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - verwenden Sie eine veraltete Version von Moq?
Tim Abell