BloC testing "The method xxx isn't defined for the type 'Object'" error

Issue

I am trying to learn testing with bloc. Followed the procedure as stated in docs.

I have lib/cubit/counter_cubit.dart and lib/cubit/counterState.dart files

counter_cubit.dart is:

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

part 'counter_state.dart';

class CounterCubit extends Cubit<CounterState> {
  CounterCubit() : super(CounterState(counterValue: 0, wasIncremented: false));

  void increment() => emit(
      CounterState(counterValue: state.counterValue + 1, wasIncremented: true));

  void decrement() => emit(CounterState(
      counterValue: state.counterValue - 1, wasIncremented: false));
}

counter_state.dart is:

part of 'counter_cubit.dart';

class CounterState extends Equatable {
  int counterValue;
  bool wasIncremented;

  CounterState({
    required this.counterValue,
    required this.wasIncremented,
  });

  @override
  List<Object?> get props => [counterValue, wasIncremented];
}

and the counter_cubit_test.dart is:

import 'package:bloc_basics/cubit/counter_cubit.dart';
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group("CounterCubit", () {
    final CounterCubit counterCubit = CounterCubit();

    test(
        "the initial state for the CounterCubitis CounterState(counterValue:0, wasIncremented:false)",
        () {
      expect(counterCubit.state,
          CounterState(counterValue: 0, wasIncremented: false));
    });

    blocTest(
        "The cubit should emit a CounterState(countervalue:1, wasIncremented:true) when cubit.increment() is called.",
        build: () => counterCubit,
        act: (cubit) => cubit!.increment(),
        expect: () => CounterState(counterValue: 1, wasIncremented: true));
  });
}

That line act: (cubit) => cubit!.increment() in counter_cubit_test.dart is throwing The method 'increment' isn't defined for the type 'Object'. Error.

Couldn’t figure out.

Solution

The method 'X' isn't defined for the type 'Object'. error is usually thrown when the type of a specific object is not clear, hence it falls back to the general type Object.

Based on the docs you provided, you should define the Cubit class type and it’s state type inside blocTest method:

blocTest<CounterCubit, CounterState>( // <-- Notice the defined types
  "The cubit should emit a CounterState(countervalue:1, wasIncremented:true) when cubit.increment() is called.",
  build: () => CounterCubit(), // <-- Create an instance of a Cubit
  act: (cubit) => cubit.increment(), // <-- ! is not needed here since the type is defined
  expect: () => [ // <-- "expect" should be defined as an array of expected states
    CounterState(counterValue: 1, wasIncremented: true),
  ]
);

Answered By – mkobuolys

Answer Checked By – Marilyn (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *