简体   繁体   English

如何使用 blocTest 对 bloc 进行单元测试?

[英]How to do Unit Testing on bloc using blocTest?

I have a bloc that works to get cartItem from orderItem by id and i want to test the bloc, I've read some bloc testing from flutter_bloc but I still don't know how to implement it on my bloc.我有一个 bloc,可以通过 id 从 orderItem 获取 cartItem,我想测试 bloc,我已经从 flutter_bloc 阅读了一些 bloc 测试,但我仍然不知道如何在我的 bloc 上实现它。 I want to do a test using dummy data that I made.我想使用我制作的虚拟数据进行测试。 I want it to get the dummy list when CartItemCheck event is emitted and remove the list when CartItemUncheck is emitted.我希望它在发出 CartItemCheck 事件时获取虚拟列表,并在发出 CartItemUncheck 时删除列表。 here is my bloc code:这是我的集团代码:

import...

abstract class CartItemEvent {
  const CartItemEvent();
}

class CartItemCheck extends CartItemEvent {
  final CartItem? item;

  CartItemCheck({this.item});

  List<Object> get props => [item!];

  @override
  String toString() => 'CartItemChecked { item: $item }';
}

class CartItemUncheck extends CartItemEvent {
  final CartItem? item;
  CartItemUncheck({this.item});

  List<Object> get props => [item!];

  @override
  String toString() => 'CartItemUnchecked { item: $item }';
}

class CartItemUpdate extends CartItemEvent {
  final String? itemId;
  final String? type;

  CartItemUpdate({this.itemId, this.type});

  List<Object> get props => [itemId!, type!];

  @override
  String toString() => 'CartItemUpdated { item: $itemId }';
}


class CartItemBloc extends Bloc<CartItemEvent, List<CartItem>> {
  final List<CartItem>? initialItems;

  CartItemBloc(this.initialItems) : super(initialItems!);

  @override
  Stream<List<CartItem>> mapEventToState(CartItemEvent event) async* {
    if (event is CartItemCheck) {
      List<CartItem> newItems = state..add(event.item!);
      yield newItems.toList();
    }
    else if (event is CartItemUncheck) {
      List<CartItem> newItems = state.where((item) => item.itemId != event.item!.itemId).toList();
      yield newItems.toList();
    } else if (event is CartItemUpdate) {
      CartItem oldItem = state.where((item) => item.itemId == event.itemId).first;
      List<CartItem> cartItems = state;
      if (event.type == 'increment') {
        CartItem updatedItem = oldItem.copyWith(qty: oldItem.qty + 1);
        cartItems[cartItems.indexWhere((item) => item.itemId == event.itemId)] = updatedItem;
        yield cartItems.toList();
      } else {
        CartItem updatedItem = oldItem.copyWith(qty: oldItem.qty - 1);
        cartItems[cartItems.indexWhere((item) => item.itemId == event.itemId)] = updatedItem;
        yield cartItems.toList();
      }
    }
  }
}

and here is my current test code:这是我当前的测试代码:

import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pikpo_screen/blocs/cart_item_bloc.dart';
import 'package:pikpo_screen/model/cart_item.dart';
import 'package:pikpo_screen/util/order_helper.dart';

main(){
  CartItemBloc? cartItemBloc;
  List<CartItem> expectedResult = [CartItem(itemId: "1"), CartItem(price: 35), CartItem(qty: 2)];
  List<CartItem> initialItem = [];
  setUp(() {
    cartItemBloc = CartItemBloc(initialItem);
  });

  test('initial state is []', () {
    expect(cartItemBloc!.state, []);
  });
  blocTest('description',
      build: () => cartItemBloc,
    act: (bloc) => bloc.add(CartItemCheck()),
    expect: () => [1]
  );
}

Thank you in advance for helping me预先感谢您帮助我

In your bloc, you emit a list of CardItem, and the bloc test expects a list of states.在您的 bloc 中,您发出一个 CardItem 列表,而 bloc 测试需要一个状态列表。 Therefore, you have a list in a list in the expect function.因此,您在期望的列表中有一个列表 function。

void main() {
  late CartItemBloc cartItemBloc;

  const expectedResult = [
    CartItem(itemId: '1'),
    CartItem(price: 35),
    CartItem(qty: 2)
  ];

  final initialItem = <CartItem>[];

  setUp(() {
    cartItemBloc = CartItemBloc(initialItem);
  });

  blocTest<CartItemBloc, List<CartItem>>(
    'description',
    build: () => cartItemBloc,
    act: (bloc) => bloc.add(const CartItemCheck(item: CartItem())),
    expect: () => [
      [
        const CartItem(),
      ]
    ],
  );
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM