代码之家  ›  专栏  ›  技术社区  ›  markhorrocks

如何正确测试响应。身体在颤振中是空的?

  •  0
  • markhorrocks  · 技术社区  · 4 年前

    在我的颤振API中,我发现了一个错误

    颤振:类型“Null”不是类型转换中类型“List”的子类型

    当响应json列表为空时。我的API是用Go编写的。 log.Println(mattersJSON) 返回 [1111 2222 3333 4444] fmt.Println(string(mattersJSON)) 返回null。这是预期的,因为查询不返回任何记录。

    在Flatter中,我的Api中有以下代码:

    Future<List<Matter>> getMatters(BuildContext context) async {
    List<Matter> matters = [];
    
    try {
      final response = await _helper.get(context, "/matters");
    
      if (response.statusCode == 200) {
        print(response.body);
    
        if (response.body == null) {
          return [];
        }
    
        print(response.body.length);
    
        print('skipped test');
        var parsed = json.decode(response.body) as List<dynamic>;
    
        for (var matter in parsed) {
          matters.add(Matter.fromJson(matter));
        }
      } else {
        Navigator.pushNamed(context, RoutePaths.login);
        return matters;
      }
    } catch (e) {
      print(e);
      return matters;
    }
    
    return matters;
    }
    

    输出如下:

    颤振:空 颤振:4 颤振:跳过测试 颤振:类型“Null”不是类型转换中类型“List”的子类型

    我很想假设这是一个空洞的回答。尸体名单的长度始终为4,这是一个回复。有记录的主体的长度始终大于4。如果是这样的话,我就可以试一下 response.body.length > 4 .然而这并不优雅,而且可能易碎。我担心我看到的错误显示列表为空,并且 print(response.body) 返回null,但返回响应。正文不是空的。

    如何正确测试空响应列表并返回[]?

    1 回复  |  直到 4 年前
        1
  •  1
  •   jamesdlin    4 年前

    假设你说的是 Response 从…起 package:http 然后 Response.body 是不可为空的,不能为空 null .

    听起来像 response.body 是文本字符串 'null' .如果你期待JSON,这是合理的。 归根结底,你的问题在于你在进行无条件的演员阵容 ( as List<dynamic> ). json.decode 返回一个 dynamic 类型而不是a List 或者 Map 正是因为它可能会返回不同类型的对象,所以正确的解决方法是首先检查:

        var parsed = json.decode(response.body);
        if (parsed is List<dynamic>) {
          for (var matter in parsed) {
            matters.add(Matter.fromJson(matter));
          }
        }
    

    然后你不需要明确检查 回答身体 当绳子 “空” 还是为了 json。解码 返回 无效的 .