dart 如何模拟一个`FutureProvider.autodispose`?

pdsfdshx  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(45)

考虑以下提供程序:

final provider = FutureProvider.autoDispose<Metadata>(
  (ref) async {
    final response = await ref.read(service).run();
    return response;
  },
  dependencies: [service],
  name: 'provider',
);

字符串
我想模拟这个提供程序,以便能够操纵它的状态(AsyncDataAsyncError等)。目前我有以下代码:

abstract class _Create<T> {
  FutureOr<T> call(AutoDisposeFutureProviderRef<T> ref);
}

class _ProviderCreate extends Mock implements _Create<Metadata> {}

test('test', () async {
      final mockFunction = _ProviderCreate();
      final container = ProviderContainer(
        overrides: [
          provider.overrideWith(mockFunction),
        ],
      );
      final listener = ListenerMock<HomeScreenMetadata>();
      // homePageProvider is a second provider that watch `provider`
      container.listen<HomePageMetadata>(homePageProvider, listener, fireImmediately: true);

      when(() => mockFunction.call(any())).thenAnswer((_) async {
        // This mock is never called
        print("called");
        ...
      });

      await container.pump();
      
      const homePageUnloaded = HomePageMetadata(loaded: false);
      const homePageLoaded = HomeScreenMetadata(loaded: true);

      verifyInOrder(
        [
          () => listener(null, homePageUnloaded),
          () => listener(homePageUnloaded, homePageLoaded),
        ],
      );

      verifyNoMoreInteractions(listener);
    });


但是由于某种原因,mockFunction的mock从未被调用。

gfttwv5a

gfttwv5a1#

我最终在每个测试中覆盖了容器,而不是使用一个可以在每个测试中被覆盖的mock函数。工作代码:

test('test', () async {
      final listener = ListenerMock<HomePageMetadata>();
      container.listen<HomePageMetadata>(homeScreenProvider, listener, fireImmediately: true);

      container.updateOverrides([
        provider.overrideWith((_) async => // TODO: Return the expected value here),
      ]);

      await container.pump();

      const homePageUnloaded = HomePageMetadata(loaded: false);
      const homePageLoaded = HomeScreenMetadata(loaded: true);

      verifyInOrder(
        [
          () => listener(null, homePageUnloaded),
          () => listener(homePageUnloaded, homePageLoaded),
        ],
      );

      verifyNoMoreInteractions(listener);
    });

字符串

相关问题