【问题标题】:Flutter test with mockito and dartz fails使用 mockito 和 dartz 进行颤振测试失败
【发布时间】:2023-03-07 06:09:01
【问题描述】:

我正在测试存储库实现,但测试失败,我找不到错误所在。

这是存储库:

class ProductRepositoryImpl implements ProductRepository {
  final ProductRemoteDataSource remoteDataSource;
  final NetworkInfo networkInfo;

  ProductRepositoryImpl(
      {@required this.remoteDataSource, @required this.networkInfo});

  @override
  Future<Either<Failure, List<Product>>> getProducts() async {
    this.networkInfo.istConnected;
    return Right(await this.remoteDataSource.getProducts());
  }
}

这是测试实现:

class MockRemoteDataSource extends Mock implements ProductRemoteDataSource {}

class MockNetworkInfo extends Mock implements NetworkInfo {}

void main() {
  ProductRepositoryImpl repository;
  MockRemoteDataSource mockRemoteDataSource;
  MockNetworkInfo mockNetworkInfo;

  final tProductModel = ProductModel(
      id: 1,
      title: 'Product 1',
      description: 'Product description',
      oldPrice: '20.99',
      discount: 10,
      storeName: 'Zé Strore',
      remainingOffers: 3,
      imagesUrls: ['https://unsplash.com/photos/EF7BVa9BB2M']);

  final productModelList = [tProductModel];

  final Product tProduct = tProductModel;
  final productList = [tProduct];

  setUp(() {
    mockRemoteDataSource = MockRemoteDataSource();
    mockNetworkInfo = MockNetworkInfo();

    repository = ProductRepositoryImpl(
        remoteDataSource: mockRemoteDataSource, networkInfo: mockNetworkInfo);
  });

  group('device is online', () {
    setUp(() {
      when(mockNetworkInfo.istConnected).thenAnswer((_) async => true);
    });

    test(
        'should return remote data when the call to remote data source is successful',
        () async {
      // arrange
      when(mockRemoteDataSource.getProducts())
          .thenAnswer((_) async => productModelList);

      // act
      final result = await repository.getProducts();

      // assert
      verify(mockRemoteDataSource.getProducts());
      expect(result, equals(Right(productList)));
    });
  });
}

报错是:

Expected: Right<dynamic, List<Product>>:<Right([ProductModel(1, Product 1, Product description, 20.99, 10, Zé Strore, 3, [https://unsplash.com/photos/EF7BVa9BB2M])])>
  Actual: Right<Failure, List<Product>>:<Right([ProductModel(1, Product 1, Product description, 20.99, 10, Zé Strore, 3, [https://unsplash.com/photos/EF7BVa9BB2M])])>

package:test_api                                                                      expect
expect
package:flutter_test/src/widget_tester.dart:441
main.<fn>.<fn>
test/…/repositories/product_repository_impl_test.dart:74

我不知道错误在哪里。对象看起来一样。我尝试使用expect(result, equals(Right&lt;Failure, List&lt;Product&gt;&gt;(productList)));,但错误仍然存​​在。 dataSource 对象有一个方法并被模拟。

【问题讨论】:

    标签: flutter flutter-test flutter-mockito


    【解决方案1】:

    我总是使用 fold 方法来做到这一点:

    final Either<Failure, List<Product>> result = await repository.getProducts();
    
    result.fold((left) => fail('test failed'), (right) {
      verify(mockRemoteDataSource.getProducts()).called(1);
      expect(right, equals(productList));
    });
    

    不知道这是否是正确的方法,但对我来说它有效。查不出来。如果它不起作用,请告诉我!

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多