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