单元测试状态

Unit testing the State

我正在尝试在 initState() 期间从 SharedPreferences 获取数据并对其进行测试。 如果我只是在状态中设置私有变量而不调用 setState(),则视图不会更新。

如果我尝试将设置变量包装在 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 的行为进行单元测试是实现代码覆盖率目标的正确方法。 State 绑定到 StatelessWidgetStatelessWidget 的 public API 是它的构造函数参数(输入)和它产生的渲染对象(输出)。没有人应该像 initState 那样调用 State 的受保护方法,除了 Flutter 本身。

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