felangel / mocktail

A mock library for Dart inspired by mockito
https://pub.dev/packages/mocktail
MIT License
588 stars 80 forks source link

Should when() calls have a better error message for not having a following thenAnswer/thenReturn call? #213

Open knyghtryda opened 8 months ago

knyghtryda commented 8 months ago

Describe the bug I ran into an extremely hard to diagnose bug. I wrote some tests and found that they were randomly failing with

Bad state: Cannot call `when` within a stub response

It was random because depending on if I randomized my tests sometimes the tests would pass or fail.

The reason for this was that on a prior test we had called when(() => someFunction()) but since the the function returns Future<void> I was under the assumption that the return value was unimportant and could be ignored. However, this meant that any subsequent when calls errored out, as _whenCall (inside mocktail.dart) was no longer null.

To Reproduce 1) Write any when call without a thenAnswer/thenReturn for a void/Future<void> function. 2) Write another when call for the same mocked class.

Expected behavior Not actually sure. Should void/Future<void> be allowed by default without a then? This doesn't feel quite right. Or should there be a better error message like Missing then function for when, or just a hint on the current error message about making sure that your whens have following thens. I could also just be mistaken and there's a good reason for when() calls without a following then.

Logs

Bad state: Cannot call `when` within a stub response
package:mocktail/src/mocktail.dart 206:5                                            when
test/features/notifications/cubits/notification_preferences_cubit_test.dart 303:11  main.<fn>.<fn>.<fn>
package:bloc_test/src/bloc_test.dart 203:25                                         testBloc.<fn>
===== asynchronous gap ===========================
dart:async                                                                          _Completer.completeError
package:bloc_test/src/bloc_test.dart 257:43                                         _runZonedGuarded.<fn>
===== asynchronous gap ===========================
dart:async                                                                          _CustomZone.registerBinaryCallback
package:bloc_test/src/bloc_test.dart 254:5                                          _runZonedGuarded.<fn>
dart:async                                                                          runZonedGuarded
package:bloc_test/src/bloc_test.dart 253:3                                          _runZonedGuarded
package:bloc_test/src/bloc_test.dart 200:11                                         testBloc
package:bloc_test/src/bloc_test.dart 156:13                                         blocTest.<fn>