【问题标题】:Unit testing the State对状态进行单元测试
【发布时间】:2017-12-01 11:39:39
【问题描述】:

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

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

【问题讨论】:

    标签: flutter


    【解决方案1】:

    使用SharedPreferences.setMockInitialValues 用测试值初始化SharedPreferences。那你就不用自己mock了。

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

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

    【讨论】:

    • 我知道 initState 是由框架调用的,但它仍然处理业务逻辑,因此应该可以对其分离进行测试。我将在其他地方尝试单独的逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多