单位测试国家

时间:2017-06-28 08:03:39

标签: flutter

我试图在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());
});

我觉得必须有一种更简单的方法。

1 个答案:

答案 0 :(得分:2)

使用SharedPreferences.setMockInitialValues初始化SharedPreferences以及测试值。那你就不需要自己嘲笑了。

我不认为单元测试initState的行为是实现代码覆盖率目标的正确方法。 StateStatelessWidget相关联。 StatelessWidget的公共API是它的构造函数参数(输入)和它生成的渲染对象(输出)。除了Flutter本身之外,没有人应该像State那样调用initState的受保护方法。

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