使用DIinjectable-getIt进行抖动测试的正确方法?

问题描述

从lib(dev)代码中初始化的getIt中获取实例是否还可以,还是应该使用另一个 方式还是其他用于测试的DI设置?

请参考以下代码

 void main() {
      TravellerProfileviewmodel travellerProfileviewmodel;
      UserService mockUserService;
      setUpAll(() {
        // CoreInjector is initialised in lib,and gives the getIt instance
        CoreInjector.initialize();
        //register mockUserService in place of actual user service in the CoreInjector.getIt
        mockUserService = registerandGetMock<UserService>(MockUserService());
        // CoreInjector gives TravellerProfileviewmodel,injected with UserService
        travellerProfileviewmodel =
            CoreInjector.getIt.get<TravellerProfileviewmodel>();
      });
}

T registerandGetMock<T>(T mockAble) {
  _removeRegistrationIfExists<T>();
  CoreInjector.getIt.registerFactory<T>(() => mockAble);
  return mockAble;
}

CoreInjector代码

class CoreInjector {
  static GetIt _getIt;

  static GetIt get getIt => _getIt;

  static void initialize() {
    _getIt ??= _configureInjection();
  }
}
@InjectableInit(preferRelativeImports: false)
GetIt _configureInjection() =>
    $initGetIt(GetIt.asNewInstance());

TravellerProfileviewmodel依赖于服务,该服务通过相同的CoreInjector在后台注入。

也可以进行构造函数注入,还是应该将构造函数参数设为可选?在下面的两种方法中,什么是更好的方法

@injectable
class TravellerProfileviewmodel extends Baseviewmodel {
  final UserService _userService;
  //injected by DI under the hood    
  TravellerProfileviewmodel(this._userService);
}

生成的可注入代码

GetIt $initGetIt(
  GetIt get,{
  String environment,EnvironmentFilter environmentFilter,}) {
  final gh = GetItHelper(get,environment,environmentFilter);
  gh.factory<UserService>(() => UserService());
  gh.factory<TravellerProfileviewmodel>(
      () => TravellerProfileviewmodel(get<UserService>()));
  return get;
}

   @injectable
    class TravellerProfileviewmodel extends Baseviewmodel {
      UserService _userService;
      //injected by DI under the hood,also gives liberty to pass optional params in case of 
        testing
      TravellerProfileviewmodel({UserService userService}){
             _userService = userService?? CoreInjector.getIt.get<UserService>();
      }
    }

生成的可注入代码

GetIt $initGetIt(
  GetIt get,environmentFilter);
  gh.factory<UserService>(() => UserService());
  gh.factory<TravellerProfileviewmodel>(
      () => TravellerProfileviewmodel(userService: get<UserService>()));
  return get;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)