繁体   English   中英

错误的 state:测试尝试在 T State 使用 bloc_test 和 mocktail 类型的参数上使用 any 或 captureAny

[英]Bad state: A test tried to use any or captureAny on a parameter of type T State using bloc_test and mocktail

我在这里尝试了https://github.com/felangel/mocktail/issues/42中的解决方案,但仍然出现错误。 这是我的代码:

class MockUserRepository extends Mock implements UserRepository {}
class MockAuthenticationBloc extends MockBloc<AuthenticationEvent, AuthenticationState> implements AuthenticationBloc {}
class FakeAuthenticationEvent extends Fake implements AuthenticationEvent {}
class FakeAuthenticationState extends Fake implements AuthenticationState {}

void main() {
  MockUserRepository mockUserRepository;
  MockAuthenticationBloc mockAuthenticationBloc;

  setUp(() {
    mockUserRepository = MockUserRepository();
    mockAuthenticationBloc = MockAuthenticationBloc();
    registerFallbackValue(FakeAuthenticationEvent());
    registerFallbackValue(FakeAuthenticationState());
  });

  group('Login', () {
    final username = 'someusername';
    final password = 'somepassword';
    final token = 'sometoken';
    final loginError = 'Some error message.';

    blocTest('emits [LoginLoading] when successful',
      build: () {
        when(() => mockUserRepository.authenticate(username: username, password: password)).thenAnswer((_) async => token);
        return LoginBloc(userRepository: mockUserRepository, authenticationBloc: mockAuthenticationBloc);
      },
      act: (bloc) => bloc.add(LoginButtonPressed(username: username, password: password)),
      expect: () => [
        LoginInitial(),
        LoginLoading(),
      ],
    );
  });
}

这是错误:

错误 state:测试尝试对AuthenticationState类型的参数使用anycaptureAny ,但之前未调用 registerFallbackValue 来为AuthenticationState注册后备值。

要修复,请执行以下操作:

void main() {
  setUpAll(() {
    registerFallbackValue(/* create a dummy instance of `AuthenticationState` */);
  });
}

这个AuthenticationState实例只会被传递,但永远不会被交互。 因此,如果AuthenticationState是 function,它不必返回有效的 object 并且可以无条件地抛出。 如果您不能轻松创建AuthenticationState的实例,请考虑定义Fake

class MyTypeFake extends Fake implements MyType {}

void main() {
  setUpAll(() {
    registerFallbackValue(MyTypeFake());
  });
}

我错过了什么?

如文档中所述:

为了支持参数匹配器,例如any()captureAny() ),mocktail 必须注册默认的回退值,以便在使用参数匹配器时返回。 开箱即用,它会自动处理所有原始类型,但是,当使用参数匹配器代替自定义类型时,开发人员必须使用registerFallbackValue()来提供默认返回值。 每种类型只需要调用一次registerFallbackValue() ,因此建议将所有registerFallbackValue()调用放在setUpAll()中。

基本上你只能在Stringintdouble和其他原始数据类型上使用any()captureAny()

对于在非原始数据类型上使用 any ,您应该注册一个默认值,以便 mocktail 知道要返回什么;

您可以像这样创建一个易于使用的 Fake

class Food {...}

class Cat {
  bool likes(Food food) {...}
}

class MockCat extends Mock implements Cat {}

class FakeFood extends Fake implements Food {}

void main() {
  setUpAll(() {
    registerFallbackValue(FakeFood());
  });

  test('...', () {
    final cat = MockCat();
    when(() => cat.likes(any()).thenReturn(true);
    ...
  });
}

暂无
暂无

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

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