单元测试状态
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
绑定到 StatelessWidget
。 StatelessWidget
的 public API 是它的构造函数参数(输入)和它产生的渲染对象(输出)。没有人应该像 initState
那样调用 State
的受保护方法,除了 Flutter 本身。
我建议你看一下 Flutter 单元测试,看看你是否可以编写更多该级别的测试,例如icon button test.
我正在尝试在 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
绑定到 StatelessWidget
。 StatelessWidget
的 public API 是它的构造函数参数(输入)和它产生的渲染对象(输出)。没有人应该像 initState
那样调用 State
的受保护方法,除了 Flutter 本身。
我建议你看一下 Flutter 单元测试,看看你是否可以编写更多该级别的测试,例如icon button test.