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) IProgress
1.Report(0,05)
IProgress1.Report(0,1) IProgress
1.Report(0,15)
IProgress1.Report(0,2) IProgress
1.Report(0,25)
IProgress1.Report(0,3) IProgress
1.Report(0,35)
IProgress1.Report(0,4) IProgress
1.Report(0,45)
IProgress1.Report(0,5) IProgress
1.Report(0,55)
IProgress1.Report(0,6) IProgress
1.Report(0,65)
IProgress1.Report(0,7) IProgress
1.Report(0,75)
IProgress1.Report(0,8) IProgress
1.Report(0,85)
IProgress1.Report(0,9) IProgress
1.Report(0,95)
IProgress1.Report(1) IProgress
1.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?
Wie sieht die gesamte Testmethode aus?
Riecht danach, dass das Setup nicht stimmt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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. =)
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!"
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. 😁
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!"
Gute Idee, ich habe das mal gemacht.
Danke! =)
Edit (gfoidl): https://github.com/moq/moq4/issues/636
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!"