Je travaille sur une application Web Flutter et j'ai du mal à exécuter un test.
flutter_test: sdk: flutter
Voici le pubspec.yaml:
import 'package:flutter_web/cupertino.dart'; import 'package:web_flutter/model/model.dart'; import 'package:web_flutter/services/service.dart'; class TenantViewModel with ChangeNotifier { Tenant _tenant; Property _property; Service _service; SubmissionResponse _submission; ResponseData _responseData; TenantViewModel(this._tenant, this._service); bool get isNew => _tenant.id == null; set tenant(Tenant tenant) { if (_tenant != tenant) { _tenant = tenant; notifyListeners(); } } Tenant get tenant => _tenant; set property(Property property) { _tenant.propertyId = property.id; notifyListeners(); } Property get property => _property; set submission(SubmissionResponse submission) { if (_submission != submission) { _submission = submission; notifyListeners(); } } SubmissionResponse get submission => _submission; set responseData(ResponseData responseData) { if (_responseData != responseData) { _responseData = responseData; notifyListeners(); } } ResponseData get responseData => _responseData; Future generateForm(String templateID) async { SubmissionResponse submission; submission = await _service.generateForm(_tenant.id, templateID); this.submission = submission; notifyListeners(); } Future getSubmission(String submissionID) async { ResponseData responseData; responseData = await _service.getSubmission(submissionID); this.responseData = responseData; notifyListeners(); } Future save() async { Tenant updatedTenant; if (tenant.isNew) { updatedTenant = await _service.createTenant(_tenant); this.tenant = updatedTenant; } else { updatedTenant = await _service.updateTenant(tenant); this.tenant = updatedTenant; } notifyListeners(); } Future refresh() async { if (isNew) { return; } var updatedTenant = await _service.getTenant(_tenant.id); if (_tenant.propertyId != null) { _property = await _service.getProperty(_tenant.propertyId); } _tenant = updatedTenant; notifyListeners(); } }
J'ai écrit quelques tests qui réussissent lorsque pub run test
exécution de pub run test
dans le terminal de l'EDI (VS Code) ou dans l'application de terminal.
Le test avec lequel j'ai des problèmes nécessite des importations de packages à partir du projet. Avec ce test en place, j'obtiens des erreurs et les deux autres tests ne s'exécutent pas. Je n'ai rien trouvé qui pointe vers une solution.
Voici le message d'erreur:
import 'package:test/test.dart'; import 'package:http/http.dart'; import 'package:http/testing.dart'; import 'dart:convert'; import 'package:web_flutter/services/service.dart'; // These are the package imports that cause errors: import 'package:web_flutter/model/model.dart'; import 'package:web_flutter/data/tenant_view_model.dart'; void main(){ test("getSubmission returns ResponseData{}", () async { // Arrange: setup the test final _service = Service(); _service.httpClient = MockClient((request) async { final responseData = { "id": "some_id", "state": "processed", "test": true, "editable": false, "expires_at": "2019-09-19T03:40:22Z", "processed_at": "2019-09-12T03:40:22Z", "batch_id": "", "download_url": "downloadURl.com", "permanent_download_url": "permanentdownloadURL.com" }; return Response(json.encode(responseData),200); }); // Act final response = await _service.getSubmission("submissionID"); // Assert expect(response.download_url, "downloadURL.com"); }); test("generateForm returns SubmissionResponse{}", () async { // Arrange: setup the test final _service = Service(); _service.httpClient = MockClient((request) async { final submissionResponse = { "status": "success", "submission": { "id": "some_id", "state": "pending", "test": false, "editable": false, "expired": false, "expires_at": null, "metadata": { "foo": 123, "bar": "baz" }, "processed_at": null, "batch_id": null, "data_requests": [], "download_url": null, "permanent_download_url": null } }; return Response(json.encode(submissionResponse),200); }); // Act final response = await _service.generateForm(42, "templateID"); // Assert expect(response.submission.id, "some_id"); }); test('Tenant View Model generateForm returns tenantVM.submission.submission.id', () async { // Arrange final _service = Service(); Tenant tenant; tenant.id = 42; _service.httpClient = MockClient((request) async { final submissionResponse = { "status": "success", "submission": { "id": "some_id", "state": "pending", "test": false, "editable": false, "expired": false, "expires_at": null, "metadata": { "foo": 123, "bar": "baz" }, "processed_at": null, "batch_id": null, "data_requests": [], "download_url": null, "permanent_download_url": null } }; return Response(json.encode(submissionResponse),200); }); TenantViewModel tenantVM = TenantViewModel(tenant, _service); // Act await tenantVM.generateForm("templateID"); // Assert expect(tenantVM.submission.submission.id, "some_id"); }); }
Si je commente ce nouveau test, les erreurs persistent. Si je commente le test et les importations associées, les deux tests restants s'exécutent et réussissent.
Ceci est le fichier de test (j'ai laissé le code incriminé en commentaire pour que vous puissiez le voir plus facilement - j'espère).
pub run test MyMac@MyMac 00:06 +0 -1: loading test/service_test.dart [E] Failed to load "test/service_test.dart": Unable to spawn isolate: file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/ui.dart:12:8: Error: Not found: 'dart:html' import 'dart:html' as html; ^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/engine.dart:11:8: Error: Not found: 'dart:html' import 'dart:html' as html; ^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web/lib/src/services/asset_bundle.dart:7:8: Error: Not found: 'dart:html' import 'dart:html' show HttpRequest; ^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/engine.dart:12:8: Error: Not found: 'dart:js' import 'dart:js' as js; ^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/engine.dart:13:8: Error: Not found: 'dart:js_util' import 'dart:js_util' as js_util; ^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/ui/compositing.dart:20:9: Error: Type 'html.Element' not found. final html.Element webOnlyRootElement; ^^^^^^^^^^^^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/engine.dart:177:37: Error: Type 'html.NodeTreeSanitizer' not found. class _NullTreeSanitizer implements html.NodeTreeSanitizer { ^^^^^^^^^^^^^^^^^^^^^^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/engine.dart:179:21: Error: Type 'html.Node' not found. void sanitizeTree(html.Node node) {} ^^^^^^^^^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/engine/bitmap_canvas.dart:26:9: Error: Type 'html.Element' not found. final html.Element rootElement = html.Element.tag('flt-canvas'); ^^^^^^^^^^^^ file:///Users/MyMac/.pub-cache/git/flutter_web-c04fb502b842859de07e36954a9390465a5426c0/packages/flutter_web_ui/lib/src/engine/bitmap_canvas.dart:28:3: Error: Type 'html.CanvasElement' not found. html.CanvasElement _canvas; ^^^^^^^^^^^^^^^^^^ 00:06 +0 -1: Some tests failed.
C'est la classe qui a la méthode que j'essaye de tester ( generateForm()
).
name: web_flutter description: An app built using Flutter for web environment: # You must be using Flutter >=1.5.0 or Dart >=2.3.0 sdk: '>=2.3.0-dev.0.1 <3.0.0' dependencies: flutter_web: any flutter_web_ui: any provider: any rxdart: ^0.22.0 http: ^0.12.0+2 json_annotation: ^2.4.0 intl: 0.15.8 dev_dependencies: build_runner: ^1.4.0 build_web_compilers: ^2.0.0 pedantic: ^1.0.0 json_serializable: ^3.0.0 test: any flutter: uses-material-design: true dependency_overrides: flutter_web: git: url: https://github.com/flutter/flutter_web path: packages/flutter_web flutter_web_ui: git: url: https://github.com/flutter/flutter_web path: packages/flutter_web_ui provider: git: url: https://github.com/kevmoo/provider ref: flutter_web
J'ai essayé: import 'package:flutter_test/flutter_test.dart';
dans le fichier de test et en l'ajoutant au pubspec.yaml:
Flutter 1.7.8+hotfix.4 ⢠channel stable ⢠git@github.com:flutter/flutter.git Framework ⢠revision 20e59316b8 (9 weeks ago) ⢠2019-07-18 20:04:33 -0700 Engine ⢠revision fee001c93f Tools ⢠Dart 2.4.0
Celles-ci provoquent leurs propres erreurs, car j'utilise Flutter Web, pas Flutter. Quelqu'un peut-il voir où je vais mal?
Je suis conscient que le test sur lequel je travaille est probablement erroné tel quel, mais je ne peux même pas arriver au point de le faire exécuter et échouer.
6 Réponses :
Le problème vient du fait que, comme mon responsable technique l'a souligné, "les tests unitaires n'ont pas accès à dart:html
. Sauf si vous les exécutez dans le navigateur."
Depuis pub.dev/packages/test:
"Par défaut, les tests sont exécutés dans la machine virtuelle Dart [machine virtuelle], mais vous pouvez également les exécuter dans le navigateur en passant pub run test -p chrome path/to/test.dart
. test
se chargera de démarrer le navigateur et le chargement des tests, et tous les résultats seront rapportés sur la ligne de commande comme pour les tests de VM. En fait, vous pouvez même exécuter des tests sur les deux plates-formes avec une seule commande: pub run test -p "chrome,vm" path/to/test.dart
"
Pour résoudre mon problème particulier, j'ai exécuté les tests en utilisant pub run test test/print_reports_card_test.dart -p chrome
.
Cette réponse doit être améliorée dans la mesure où elle ne traite pas des raisons pour lesquelles les tests précédents ont réussi, mais pas le nouveau test. La question est quand et où dart:html
est importé? Je l'avais importé dans un autre fichier, mais la suppression de l'importation n'a pas résolu le problème, il est donc importé par une dépendance, je pense.
Puisque vous exécutez des tests de flutter pour le Web qui utilisent le package dart: html, vous devez cibler la plate-forme appropriée.
flutter test --platform chrome
J'ai eu un problème similaire lors du développement d'une application mobile, mais il s'est avéré que j'ai importé le package dart.html accidentellement. Je viens de le supprimer et j'ai pu exécuter le programme.
merci, c'est exactement ce qui m'est arrivé aussi!
J'ai fait cette erreur exacte plusieurs fois maintenant. C'est toujours quand j'essaye d'importer @required je pense
Une autre solution au cas où vous auriez des tests pour le Web et le mobile consiste à ajouter @TestOn('browser')
en haut de votre fichier de test.
Voici le doc complet
Modifier l' import 'dart:html';
pour import 'package:http/http.dart' as http;
puis modifiez les dépendances des fichiers pubspec.yaml
en
dependencies: flutter: sdk: flutter http:
et cliquez sur pub get
J'ai eu exactement le même problème. Mon problème était que j'avais importé le package:url_launcher_web/url_launcher_web.dart
ce que vous n'êtes apparemment pas censé faire. C'était une importation inutilisée de toute façon, donc je l'ai supprimée et mon mobile a bien fonctionné.
Pour le réparer, supprimez-le et le problème sera résolu.
Pourquoi cette erreur se produit-elle : L'analyseur produit ce diagnostic lorsqu'une importation n'est pas nécessaire car aucun des noms importés n'est référencé dans la bibliothèque d'importation.
Exemples :
Le code suivant produit ce diagnostic car rien n'est défini dansÂ
import 'dart:async'; void main() {}
 est référencé dans la bibliothèque:
dart:async
Correctifs courants :
Si l'importation n'est pas nécessaire, supprimez-la.
Si certains des noms importés sont destinés à être utilisés, ajoutez le code manquant.
les tests unitaires n'ont pas accès à dart: html Sauf si vous les exécutez dans le navigateur
De pub.dev/packages/test : "Par défaut, les tests sont exécutés dans la VM Dart, mais vous pouvez également les exécuter dans le navigateur en passant
pub run test -p chrome path/to/test.dart
.test
will take soin de démarrer le navigateur et de charger les tests, et tous les résultats seront rapportés sur la ligne de commande comme pour les tests de VM. En fait, vous pouvez même exécuter des tests sur les deux plates-formes avec une seule commande:pub run test -p "chrome,vm" path/to/test.dart
"n'importe quel moyen de les exécuter sur un navigateur pour les tests d'intégration Web, où j'exécute une commande comme celle-ci: flutter drive --target = test_driver / file_storage.dart -v --use-existing-app = / localhost: 53201