flutter - 单元测试状态

标签 flutter

我试图在 initState() 期间从 SharedPreferences 获取数据并测试它。 如果我只是在状态内设置私有(private)变量而不调用 setState(), View 不会更新。

如果我尝试将设置变量包装在 setState() 中,我的测试将中断 setState() 方法中带有空指针。

NoSuchMethodError: The method 'markNeedsBuild' was called on null.
Receiver: null
Tried calling: markNeedsBuild()

这是我的 initState()

initState() {
  _appRepository.readOnboardingCompleted().then((readValue) {
    print("read: $readValue");
    setState(()=>_onboardingCompleted = readValue);
});
  super.initState();
}

这是测试

test(
  'GIVEN app starts WHEN onboarding was completed THEN onboarding is disabled',() {

     when(mockAppRepository.readOnboardingCompleted()).thenReturn(mockBoolFuture);
     AppState systemUnderTest = new AppState(mockAppRepository);
     systemUnderTest.initState();
     verify(mockAppRepository.readOnboardingCompleted());
});

我觉得必须有一种更简单的方法来做到这一点。

最佳答案

使用SharedPreferences.setMockInitialValues使用测试值初始化 SharedPreferences。那么你不需要自己 mock 它。

我认为对 initState 的行为进行单元测试并不是实现代码覆盖率目标的正确方法。 StateStatelessWidget 绑定(bind)。 StatelessWidget 的公共(public) API 是它的构造函数参数(输入)和它生成的渲染对象(输出)。除了 Flutter 本身之外,没有人应该调用 State 的 protected 方法,例如 initState

我建议你看一下 Flutter 单元测试,看看你是否可以编写更多该级别的测试,例如icon button test .

关于flutter - 单元测试状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44796857/

相关文章:

android - 如何确定Google服务插件,gradle插件和dart pub软件包的兼容版本

android - 如何修复错误 : "invalid item ' Flutter for Android' in the dependencies list"

android - 如何使用 flutter 警报管理器打开应用程序

forms - 如何从另一个 dart 文件中调用有状态小部件(有表单)方法?- Flutter

dart - Flutter - 使用自定义十六进制颜色

firebase - flutter 错误 : type 'Future<dynamic>' is not a subtype of type 'List<Game>'

android - Flutter - 我无法使用 Google 帐户登录

android - 为什么我在 Android 12 模拟器上运行时在日志中看到 EGL_emulation app_time_stats?

Flutter - 在构建期间调用 setState() 或 markNeedsBuild()

android - 如何强制flutter `camera`插件以纵向模式拍照?