title: Dart/Flutter Web unit testing errors: Error: Not found: 'dart:html'
body: <p>I'm working on a Flutter web app and I'm having trouble running a test.</p>
  
  <pre><code>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
  </code></pre>
  
  <p>This is the pubspec.yaml:</p>
  
  <pre><code>name: web_flutter
  description: An app built using Flutter for web
  
  environment:
    # You must be using Flutter &gt;=1.5.0 or Dart &gt;=2.3.0
    sdk: '&gt;=2.3.0-dev.0.1 &lt;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
  
  </code></pre>
  
  <p>I wrote a couple of tests that are passing when I run <code>pub run test</code> in either the IDE's terminal  (VS Code) or in terminal app.</p>
  
  <p>The test I'm having trouble with requires some package imports from the project. With this test in place I get errors and the other two tests don't run. I haven't found anything that points to a solution.</p>
  
  <p>This is the error message:</p>
  
  <pre><code>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.
  </code></pre>
  
  <p>If I comment out this new test, the errors persist. If I comment out the test and the related imports the remaining two tests run and pass.</p>
  
  <p>This is the test file (I left the offending code commented out so it's easier for you to see - I hope).</p>
  
  <pre><code>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");
    });
  }
  
  </code></pre>
  
  <p>This is the class that has the method I'm trying to test (<code>generateForm()</code>).</p>
  
  <pre><code>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 =&gt; _tenant.id == null;
  
    set tenant(Tenant tenant) {
      if (_tenant != tenant) {
        _tenant = tenant;
        notifyListeners();
      }
    }
  
    Tenant get tenant =&gt; _tenant;
  
    set property(Property property) {
      _tenant.propertyId = property.id;
      notifyListeners();
    }
  
    Property get property =&gt; _property;
  
    set submission(SubmissionResponse submission) {
      if (_submission != submission) {
        _submission = submission;
        notifyListeners();
      }
    }
  
    SubmissionResponse get submission =&gt; _submission;
  
    set responseData(ResponseData responseData) {
      if (_responseData != responseData) {
        _responseData = responseData;
        notifyListeners();
      }
    }
  
    ResponseData get responseData =&gt; _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();
    }
  }
  </code></pre>
  
  <p>I have tried:
  <code>import 'package:flutter_test/flutter_test.dart';</code> in the test file and adding this to the pubspec.yaml:</p>
  
  <pre><code>  flutter_test:
      sdk: flutter
  </code></pre>
  
  <p>These cause their own varieties of errors, because I'm using Flutter Web, not Flutter. Can anyone see where I'm going wrong?</p>
  
  <p>I am aware that the test I'm working on is probably wrong as it is, but I can't even get to the point of having it run and fail.</p>