Акведук: Плохое состояние: для объекта _MyEntity не найдено ни одного объекта. Вы забыли создать ManagedContext? - PullRequest
0 голосов
/ 17 января 2020

Я начинаю новый проект и хочу использовать тестовую разработку. Это моя сущность:

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'?

Разрешено ли мне использовать объекты для логов без базы данных c?

1 Ответ

0 голосов
/ 17 января 2020

На этот вопрос был дан ответ на канале Акведук Slack , поэтому я перемещаю его здесь, чтобы его было легче найти.

Ответы на ответы :

Вам нужно будет запустить TestHarness со смешанным TestHarnessORMMixin. После этого вы можете использовать MnagedObject (si c), однако сочтете нужным.

joeconwaystk продолжил :

Да, что сказал Редукс… каркас обрабатывает TDD с ORM, создавая временную схему на сервере базы данных во время тестирования (с помощью the TestHarnessORMixin)

Поэтому я обновил файл 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 напрямую, вот что я и сделал.

Для получения дополнительной информации о настройке тестирования см. это видео и документацию .

...