Laden...

Moq: Anzahl Aufrufe wird beim Verifizieren falsch erkannt

Erstellt von pinki vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.381 Views
pinki Themenstarter:in
709 Beiträge seit 2008
vor 5 Jahren
Moq: Anzahl Aufrufe wird beim Verifizieren falsch erkannt

Hallo zusammen,

in einem meiner UnitTests teste ich unter anderem, ob der Fortschritt wie erwartet an ein Mock-Objekt vom Typ IProgress<double> gemeldet wird.

Meine Mock-Konfiguration sieht dabei so aus:


var progressMock = new Mock<IProgress<double>>();
progressMock.Setup(p => p.Report(It.IsInRange(0d, 1d, Range.Inclusive)));

Das Verifizieren geschieht so:


progressMock.Verify(p => p.Report(It.IsInRange(0d, 1d, Range.Inclusive)), Times.Exactly(22));
progressMock.VerifyNoOtherCalls();

Ich erwarte, dass die Report-Methode genau 22x aufgerufen wird.

Der Test schlägt mit folgender Meldung fehl:> Fehlermeldung:

Moq.MockException:
Expected invocation on the mock exactly 22 times, but was 21 times: p => p.Report(It.IsInRange<Double>(0, 1, Range.Inclusive))

Configured setups:
p => p.Report(It.IsInRange<Double>(0, 1, Range.Inclusive))

Performed invocations:
IProgress1.Report(0) IProgress1.Report(0,05)
IProgress1.Report(0,1) IProgress1.Report(0,15)
IProgress1.Report(0,2) IProgress1.Report(0,25)
IProgress1.Report(0,3) IProgress1.Report(0,35)
IProgress1.Report(0,4) IProgress1.Report(0,45)
IProgress1.Report(0,5) IProgress1.Report(0,55)
IProgress1.Report(0,6) IProgress1.Report(0,65)
IProgress1.Report(0,7) IProgress1.Report(0,75)
IProgress1.Report(0,8) IProgress1.Report(0,85)
IProgress1.Report(0,9) IProgress1.Report(0,95)
IProgress1.Report(1) IProgress1.Report(1)

Wenn ich die aufgeführten Aufrufe nachzähle, komme ich auf 22.

Nun habe ich aus Neugier mal den erwarteten Wert von 22 auf 21 gesetzt um zu gucken, was passiert.
Nun erhalte ich diesen Fehler:> Fehlermeldung:

Moq.MockException: The following invocations were not verified:
IProgress`1.Report(1)

Was mache ich falsch?

16.806 Beiträge seit 2008
vor 5 Jahren

Wie sieht die gesamte Testmethode aus?

Riecht danach, dass das Setup nicht stimmt.

pinki Themenstarter:in
709 Beiträge seit 2008
vor 5 Jahren

Ich habe den Fehler gefunden.
Die vorletzte 1 aus der Ausgabe ist eigentlich eine 1,000...2.
Nun runde ich den Wert vor der Übergabe an die Report-Methode und alles ist gut. =)

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo pinki,

tja, das ist das Problem mit Gleitkommazahlen 😉

Wenn es um Vergleiche geht und es möglich ist int zu verwenden, so sollte auch int verwendet werden, da so die Vergleiche exakt durchführbar sind.

Hier könntest eben Zahlen aus dem Intervall [0, 100] übergeben und gut ist es.

[FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

pinki Themenstarter:in
709 Beiträge seit 2008
vor 5 Jahren

Moin Gü.
Ja, das war eigene Schusseligkeit. Den anderen Fall, dass die Zahl 0,999... sein könnte, hatte ich bedacht. Deswegen die zweite 1.
Die Ausgabe der von Moq geworfenen MockException finde ich dennoch nicht so in Ordnung, da diese ja eine glatte 1 anzeigt.
Wäre hier der genaue Wert, wie ihn auch der Debugger zeigt, angezeigt worden, wäre meine Hand direkt an meine Stirn gewandert. 😁

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo pinki,

Die Ausgabe der von Moq geworfenen MockException finde ich dennoch nicht so in Ordnung

In diesem Fall könntest (und solltest) du in https://github.com/moq/moq4/issues eine Issue erstellen, damit das u.U. geändert werden kann.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

pinki Themenstarter:in
709 Beiträge seit 2008
vor 5 Jahren

Gute Idee, ich habe das mal gemacht.

Danke! =)

Edit (gfoidl): https://github.com/moq/moq4/issues/636

pinki Themenstarter:in
709 Beiträge seit 2008
vor 5 Jahren

Ab der nächsten Version (> 4.8.3) werden die genauen Werte ausgegeben. =)

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo pinki,

das ist schön 😃 und genauso sollte open source gelebt werden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"