13
votes

Erreurs de test d'unité Web Dart / Flutter: Erreur: introuvable: 'dart: html'

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.


3 commentaires

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


6 Réponses :


0
votes

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 .


1 commentaires

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.



8
votes

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


0 commentaires

12
votes

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.


2 commentaires

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



0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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.


0 commentaires