0

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

这是存储库:

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<Failure, List<Product>>(productList)));,但错误仍然存​​在。dataSource 对象有一个方法并被模拟。

4

1 回答 1

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-06T18:39:06.850 回答