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.testwill 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