testing - 如何修复 'type ' () => T' 不是类型转换中 'T' 类型的子类型'

标签 testing dart flutter json-serialization

我正在使用 json(反)序列化手动设置模型类。到目前为止,我已经实现了一些测试用例。特别是我检查 toJson -> fromJson 是否是我名为 Session 的模型类型的标识。

这是我的模型类型的相关部分:

class Session extends Equatable {
  final List<User> audience;

/* ... */

  Session.fromJson(Map<String, dynamic> json) :
        /* ... */
         audience = (json['audience'] as List).map(((it) => 
              User.fromMap(it))).toList();

  Map<String, dynamic> toJson() => {
      /* ... */
      'audience': audience.map((it) => it.toJson()).toList()
    };
}

这些是audience 字段中的类型:

class User extends Equatable {
  factory User.fromJson(Map<String, dynamic> json) {
    if (_isRegisteredUserJson(json)) {
      return RegisteredUser.fromMap(json);
    } else {
      return User(id: json['id']);
    }
  } 

/* ... */
}

class RegisteredUser extends User {/* ... */}

在我的测试中,我设置了受众字段(使用 faker 库),如下所示:


User _user() => User(id: faker.guid.guid());

RegisteredUser _registeredUser() => RegisteredUser(
    id: faker.guid.guid(),
    alias: faker.person.name(),
    email: faker.internet.email());


Session _session => Session(
    audience: faker.randomGenerator
        .amount((n) => n % 3 == 0 ? _registeredUser() : _user, 100)
        .cast<User>()
/* ... */
);

我希望 audience 列表在 toJson() 返回后仅包含 UserRegisteredUser 类型的元素.相反,我得到一个包含 RegisteredUsers_Closure: () => 'User from Function' 的列表,我不确定那是什么。 结果,我收到以下测试错误消息:

00:00 +4 -1: toJson -> fromJson is identity for Session [E]
  type '() => User' is not a subtype of type 'User' in type cast
  dart:_internal/cast.dart 99:46                     _CastListBase.[]
  dart:collection/list.dart 60:33                    __CastListBase&_CastIterableBase&ListMixin.elementAt
  dart:_internal/iterable.dart 414:40                MappedListIterable.elementAt
  dart:_internal/iterable.dart 219:19                ListIterable.toList
  package:feedback/model/base_module.dart 42:54      BaseModule.toJson
  package:feedback/model/session.dart 51:23          Session.toJson
  test/json_test.dart 34:47                          main.<fn>.<fn>
  package:test_api/src/backend/declarer.dart 168:27  Declarer.test.<fn>.<fn>.<fn>
  ===== asynchronous gap ===========================
  dart:async/future_impl.dart 22:43                  _Completer.completeError
  dart:async/runtime/libasync_patch.dart 40:18       _AsyncAwaitCompleter.completeError
  package:test_api/src/backend/declarer.dart         Declarer.test.<fn>.<fn>.<fn>
  ===== asynchronous gap ===========================
  dart:async/zone.dart 1053:19                       _CustomZone.registerUnaryCallback
  dart:async/runtime/libasync_patch.dart 77:23       _asyncThenWrapperHelper
  package:test_api/src/backend/declarer.dart         Declarer.test.<fn>.<fn>.<fn>
  package:test_api/src/backend/invoker.dart 250:15   Invoker.waitForOutstandingCallbacks.<fn>
  ===== asynchronous gap ===========================
  dart:async/zone.dart 1045:19                       _CustomZone.registerCallback
  dart:async/zone.dart 962:22                        _CustomZone.bindCallbackGuarded
  dart:async/timer.dart 52:45                        new Timer
  dart:async/timer.dart 87:9                         Timer.run
  dart:async/future.dart 174:11                      new Future
  package:test_api/src/backend/invoker.dart 399:21   Invoker._onRun.<fn>.<fn>.<fn>

00:00 +4 -1: Some tests failed.

Unhandled exception:
Dummy exception to set exit code.
#0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1112:29)
#1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#3      _Timer._runTimers (dart:isolate/runtime/libtimer_impl.dart:391:30)
#4      _Timer._handleMessage (dart:isolate/runtime/libtimer_impl.dart:416:5)
#5      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)

最佳答案

感谢 Jordan Davies,答案如下:

在方法调用 _user 中,我不小心省略了括号,因此在我想要该函数结果的地方传递了一个函数作为参数。

关于testing - 如何修复 'type ' () => T' 不是类型转换中 'T' 类型的子类型',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56025621/

相关文章:

node.js - 如何增加页面加载的转到超时?

javascript - 对 Javascript、PHP 和 Dart 进行基准测试

angularjs - 用于 mustache 和其他指令的 AngularDart 指令表达式语法

websocket - dart 聊天服务器示例,从另一台机器连接

Flutter 使用 ProxyProvider

flutter - 如何在 Flutter 中更改 DropdownButton 的选定索引

maven - Sonar Maven Plugin 如何编排测试?

testing - 简单模拟 - 如何?

json - 使用 JSON 输出执行集成测试时出错

通过容器的图像