代码之家  ›  专栏  ›  技术社区  ›  Jonathan

如何编写一个Flutter方法的单元测试,该方法将在稍后完成并具有未来?

  •  0
  • Jonathan  · 技术社区  · 5 年前

    这是我的测试:

        test('mark as viewed', () {
          final a = Asset();
          expect(a.viewed, false);
          a.markAsViewed();
          expect(a.viewed, true);
        });
    

    下面是它正在测试的方法:

      void markAsViewed() {
        viewed = true;
        Repository.get().saveToStorage();
      }
    

    这个 saveToStorage() 方法是一个异步,我只需要在后台执行它。

    Make sure to use [expectAsync] or the [completes] matcher when testing async code. 但我不知道怎么做。有人能给我解释一下或者给我指一下正确的文件吗?我找不到任何关于如何处理这些异步的东西 Future 那是要退回的,但要单独完成。

    明确地说-这个单元测试不是测试它是否被保存到存储中,只是一个关于设置的基本测试 viewed true .

    编辑

    package:flutter/src/services/platform_channel.dart 319:7  MethodChannel.invokeMethod
    ===== asynchronous gap ===========================
    dart:async                                                _asyncErrorWrapperHelper
    package:exec_pointers/asset_details.dart                  Repository.saveToStorage
    package:exec_pointers/asset_details.dart 64:22            Asset.markAsViewed
    test/asset_details_test.dart 57:9                         main.<fn>.<fn>
    This test failed after it had already completed. Make sure to use [expectAsync]
    or the [completes] matcher when testing async code.
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Nkosi    5 年前

    此代码与实现问题紧密耦合,这些问题使隔离测试变得困难。

    例如

    class Asset {
        Asset({Repository repository}) {
            this.repository = repository;
        }
    
        final Repository repository;
        bool viewed;
    
        void markAsViewed() {
            viewed = true;
            repository.saveToStorage();
        }
    
        //...
    }
    

    // Create a Mock Repository using the Mock class provided by the Mockito package.
    // Create new instances of this class in each test.
    class MockRepository extends Mock implements Repository {}
    
    main() {
      test('mark as viewed', () {
        final repo = MockRepository();
        // Use Mockito to do nothing when it calls the repository
        when(repo.saveToStorage())
          .thenAnswer((_) async => { });
    
        final subject = Asset(repo);
        expect(subject.viewed, false);
        subject.markAsViewed();
        expect(subject.viewed, true);
        //
        verify(repo.saveToStorage());
      });
    }
    

    现在应该可以在不出现依赖项的意外行为的情况下执行测试。

    参考 An introduction to unit testing
    Mock dependencies using Mockito
    参考 mockito 4.1.1

    推荐文章