mardi 4 février 2020

Flutter-Mochito nested methods testing

I have no experience using Mochito or any other testing libraries. I'm trying to testing json parsing methods but my main method has nested architecture. I wrote a test methods but it doesn't work and i got some errors because of nested architecture .

Learning how to solve this problem helps me to create test for my all project. That's why your helps make me appreciate

My json parsing methods: (I prefered nested methods)

Future<List<LayerTreeModel>> fetchLayers({http.Client client, String workspace}) async {
    final response = await client.get(Uri.parse("${ApplicationSettings.url}/tiles/$workspace/layers?sessionID=${ApplicationSettings.sessionID}")
      ,headers: {'charset':'utf-8','Content-Type': 'application/x-www-form-urlencoded'});
     return parseLayers(utf8.decode(response.bodyBytes));
    }



    List<LayerTreeModel> parseLayers(String responseBody) {
     Map map = jsonDecode(responseBody);

    return parseLayer(map: map);
    }



     List<LayerTreeModel> list = List();


    parseLayer({Map map,bool init=true}) {

      list=List();


     if(!init){
    var data =map;
    data.forEach((k,v){

      list.add(LayerTreeModel.fromJson(v, id: k ));

      print("not init-LayerTreeModelMap.fromJson(v, id: k ) ${LayerTreeModel.fromJson(v, id: k ).color}--${LayerTreeModel.fromJson(v, id: k ).enabled}");
    });
     }else{
    var data =LayerTreeModel.initial(map);
    data.map.forEach((k,v){

      list.add(LayerTreeModel.fromJson(v, id: k ));

      print("LayerTreeModelMap.fromJson(v, id: k )");
    });
      }

       return list;
     }

My Test Code is :

 class MockClientLayers extends Mock implements http.Client{}

 main(){
  group('fetchLayers', (){
  test("returns Layers if the http call completes successfully", () async{
    final client=MockClientLayers();
    when(client.get(Uri.parse("${ApplicationSettings.Url}/tiles/AL/layers?sessionID=${ApplicationSettings.sessionID}") ,headers: {'charset':'utf-8','Content-Type': 'application/x-www-form-urlencoded'}),)
    .thenAnswer((_) async =>http.Response('{"displayName":"AL"}',200));

   expect(await fetchLayers(client: client,workspace:"AL"), const TypeMatcher());

  });

  test("returns Layers if the http call completes with an error", () async{
    final client=MockClientLayers();
    when(client.get(Uri.parse("${ApplicationSettings.Url}/tiles/AL/layers?sessionID=${ApplicationSettings.sessionID}") ,headers: {'charset':'utf-8','Content-Type': 'application/x-www-form-urlencoded'}),)
        .thenAnswer((_) async =>http.Response('Not Found',404));

    expect( await fetchLayers(client: client,workspace:"AL"), throwsException);

  });
});
}

and I get these errors:

    response body bytes [123, 34, 100, 105, 115, 112, 108, 97, 121, 78, 97, 109, 101, 34, 58, 34, 65, 76, 78, 89, 65, 34, 125]
dart:core                                                  Object.noSuchMethod
package:/models/layer_tree_model.dart 45:14  parseLayer
package:/models/layer_tree_model.dart 22:10  parseLayers
package:/models/layer_tree_model.dart 14:10  fetchLayers

NoSuchMethodError: The method 'forEach' was called on null.
Receiver: null
Tried calling: forEach(Closure: (dynamic, dynamic) => Null)

response body bytes [78, 111, 116, 32, 70, 111, 117, 110, 100]
dart:convert                                               jsonDecode
package:/models/layer_tree_model.dart 20:13  parseLayers
package:/models/layer_tree_model.dart 14:10  fetchLayers

FormatException: Unexpected character (at character 1)
Not Found
^

How can i test nested methods using mochito in Flutter? Is there any simplest way for testing?

Aucun commentaire:

Enregistrer un commentaire