dart-lang / fake_async

Fake asynchronous events for deterministic testing.
https://pub.dev/packages/fake_async
Apache License 2.0
90 stars 16 forks source link

Why does making the callback function async break expect? #51

Open CorvetteCole opened 1 year ago

CorvetteCole commented 1 year ago

I think I just don't understand this, but why does this test fail (as expected):

test('test smoke test -- this test should fail', () {
  fakeAsync((async) {
    expect(true, isFalse);
  });
});

But this one passes:

test('test smoke test -- this test should fail', () async {
  fakeAsync((async) async {
    expect(true, isFalse);
  });
});

I don't understand this behavior, and I think it is the root of several bugs within my tests

bartekpacia commented 1 year ago

I've got the same question – what's the cause of this behavior?

Here's my example. I expect the below test to pass, but it times out instead.

import 'package:fake_async/fake_async.dart';
import 'package:test/test.dart';

void main() {
  test('test smoke test -- this test should pass', () async {
    await fakeAsync((async) async {
      final future = doWork();
      async.elapse(const Duration(seconds: 2));
      final value = await future;
      expect(value, 1);
    });
  });
}

Future<int> doWork() async {
  await Future<void>.delayed(const Duration(seconds: 1));

  return 1;
}
$ dart test main.dart
00:30 +0 -1: test smoke test -- this test should pass [E]                                                                                   
  TimeoutException after 0:00:30.000000: Test timed out after 30 seconds. See https://pub.dev/packages/test#timeouts
  dart:isolate  _RawReceivePortImpl._handleMessage

To run this test again: /Users/bartek/fvm/versions/stable/bin/cache/dart-sdk/bin/dart test main.dart -p vm --plain-name 'test smoke test -- this test should pass'
00:30 +0 -1: Some tests failed.                                                                                                             

Consider enabling the flag chain-stack-traces to receive more detailed exceptions.
For example, 'dart test --chain-stack-traces'.
gnprice commented 1 year ago

This appears to be the same issue as #38, and can probably be closed as a duplicate.

(I have the same question, and am curious about the answer!)

bartekpacia commented 1 year ago

I like that this issue has code that can be copy-pasted to reproduce the problem.

gnprice commented 1 year ago

Sure. The fix for that is to copy the information over into a single thread :slightly_smiling_face: — done as https://github.com/dart-lang/fake_async/issues/38#issuecomment-1551771957 .

bartekpacia commented 1 year ago

Haha nice :) this one can be closed now.

CorvetteCole commented 1 year ago

I can close this issue. It's been quite a long time though, I am unsure the dart team is interested in addressing this

bartekpacia commented 1 year ago

@CorvetteCole That's a good idea, everything is already in #38.