我试图在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());
});
我觉得必须有一种更简单的方法。
答案 0 :(得分:2)
使用SharedPreferences.setMockInitialValues
初始化SharedPreferences
以及测试值。那你就不需要自己嘲笑了。
我不认为单元测试initState
的行为是实现代码覆盖率目标的正确方法。 State
与StatelessWidget
相关联。 StatelessWidget
的公共API是它的构造函数参数(输入)和它生成的渲染对象(输出)。除了Flutter本身之外,没有人应该像State
那样调用initState
的受保护方法。
我建议您看一下Flutter单元测试,看看是否可以编写更多级别的测试,例如: icon button test