webentwicklung-frage-antwort-db.com.de

Moq mit Objektparameter überprüfen

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 die gleichen Eigenschaften hat. Der erste Parameter ist in Ordnung überprüft.

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 passiert immer, auch wenn es fehlschlagen sollte. Die Asserts im Rückruf schlagen zwar fehl, die Ausnahme wird jedoch nicht an den äußeren Kontext übergeben, sodass der Test immer erfolgreich ist.

Können Sie mir helfen, das zu finden, was ich falsch mache?

68
rhughes

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

Der Grund dafür ist, dass Moq (wahrscheinlich) Object.Equals Unter dem Deckmantel verwendet, um zu testen, ob der ImageFilterOptions -Parameter, mit dem die Methode aufgerufen wurde, dieselbe Instanz ist, die Sie im Aufruf angegeben haben Verify.

Sie können nicht dieselbe Instanz sein, da Sie in Verify eine new ImageFilterOptions() erstellen.

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

In Ihrem Fall möchten Sie sicherstellen, dass der Parameter vom Typ ImageFilterOptions ist und dass sowohl Width als auch Height auf 256 Gesetzt sind. Der Ausdruck, mit dem Sie das tun können, lautet:

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

Ihr Aufruf von Verify könnte also so aussehen:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
109