2

我正在开始一个新项目并想使用测试驱动开发。这是我的实体:

import 'package:aqueduct/aqueduct.dart';

class MyEntity extends ManagedObject<_MyEntity> implements _MyEntity {}class _MyEntity {
  @primaryKey
  int id;
  int myValue;
}

当我从文本文件中提取一些数据时,我想独立于数据库使用 MyEntity。但是当我尝试像这样测试它时

void main() {
  test('DatabaseBuilder returns multiple entities', () {
    List<MyEntity> entities = [];
    entities.add(MyEntity());
    expect(entities.length, greaterThan(0));
  });
}

我收到以下错误:

错误状态:未找到“_MyEntity”的实体。您是否忘记创建“ManagedContext”?

我是否不允许将实体用于非数据库逻辑?

4

2 回答 2

2

这个问题Aqueduct Slack 频道上得到了回答,所以我把它移到这里以便更容易搜索。

减少回答

您将需要从TestHarness混合 开始TestHarnessORMMixin。之后您可以使用 MnagedObject (原文如此),但您认为合适。

joeconwaystk 跟进

是的,Reductions 所说的……框架通过在测试期间在数据库服务器中创建一个临时模式(使用 TestHarnessORMixin)来使用 ORM 处理 TDD

所以我更新了 test/harness/app.dart 文件,如下所示:

class Harness extends TestHarness<MyChannel> with TestHarnessORMMixin {
  @override
  Future onSetUp() async {
    await resetData();
  }

  @override
  Future onTearDown() async {}

  @override
  ManagedContext get context => channel.context;
}

我的测试看起来像这样:

Future main() async {
  final harness = Harness()..install();

  test('DatabaseBuilder returns multiple entities', () {
    List<MyEntity> entities = [];
    entities.add(MyEntity());
    expect(entities.length, greaterThan(0));
  });
}

即使我没有直接使用线束,安装它也足以消除错误。

如果您不喜欢该方法,我发现的另一个选择是创建一个模型类,该模型类反映 _MyEntity 而不扩展 ManagedObject:

class MyEntityModel implements _MyEntity {
  @override
  int id;

  @override
  int myValue;
}

然后可以在实际插入数据库时​​将其映射到 MyEntity 。最好只安装测试工具并直接使用 MyEntity,这就是我所做的。

有关设置测试的更多帮助,请参阅此视频文档

于 2020-01-17T00:55:34.040 回答
0

对我来说,实例化 a 就足够了ManagedContext

void main() {
  final dataModel = ManagedDataModel.fromCurrentMirrorSystem();
  final _ = ManagedContext(dataModel, null);

  // my tests go here
}

我做了一个简单的单元测试,不需要数据库。

于 2020-06-01T14:06:26.077 回答