DT Dart  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Формы и валидация ввода

Тест по теме «Формы и валидация ввода» охватывает «Контроллеры», «Состояние и проверка формы», «Асинхронная проверка», «Сообщения пользователю» и «Тестовый сценарий». В 25 вопросах нужно читать код, различать граничные случаи, выбирать место исправления, формулировать внешний договор и проектировать регрессионную проверку. Заданий с фрагментами кода — 15; в каждом вопросе один правильный ответ из пяти.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На работу отведено 70 минут. В заданиях с кодом опирайтесь на показанный фрагмент и наблюдаемое поведение; в ситуационных — на публичный договор и последствия решения.
Вопрос 1 из 25
Какое утверждение о показанном фрагменте и теме «Контроллеры» опирается на реальную гарантию Dart или используемого интерфейса?
DartDart · Контроллеры · семантика
class _EmailFieldState extends State<EmailField> {
  final controller = TextEditingController();

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}

// Контекст задания: проверка семантики фрагмента.
Вопрос 2 из 25
После одного успешного запуска фрагмент признали готовым. Какой набор случаев по теме «Контроллеры» всё ещё нужно проверить раздельно?
DartDart · Контроллеры · границы
class _EmailFieldState extends State<EmailField> {
  final controller = TextEditingController();

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}

// Контекст задания: анализ граничных входов.
Вопрос 3 из 25
На ревью просят не размножать проверки по вызывающему коду. Какое исправление для «Контроллеры» отвечает этому требованию?
DartDart · Контроллеры · исправление
class _EmailFieldState extends State<EmailField> {
  final controller = TextEditingController();

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}

// Контекст задания: выбор места исправления.
Вопрос 4 из 25
Перед обновлением зависимости нужно защитить исправление «Контроллеры». Какая проверка подходит лучше всего?
Вопрос 5 из 25
Какой контракт по теме «Контроллеры» отделяет наблюдаемое поведение от внутренних шагов?
Вопрос 6 из 25
Какой вариант правки убирает источник дефекта «Состояние и проверка формы» и не заставляет клиентов дублировать защиту?
DartDart · Состояние и проверка формы · исправление
final formKey = GlobalKey<FormState>();

Future<void> submit() async {
  if (!(formKey.currentState?.validate() ?? false)) return;
  formKey.currentState!.save();
  await account.update();
}

// Контекст задания: выбор места исправления.
Вопрос 7 из 25
Код проходит обычный сценарий. Какие проверки по теме «Состояние и проверка формы» нужны, чтобы разные граничные исходы не слились в один?
DartDart · Состояние и проверка формы · границы
final formKey = GlobalKey<FormState>();

Future<void> submit() async {
  if (!(formKey.currentState?.validate() ?? false)) return;
  formKey.currentState!.save();
  await account.update();
}

// Контекст задания: анализ граничных входов.
Вопрос 8 из 25
Что в поведении этого кода гарантировано правилами темы «Состояние и проверка формы», а не случайно совпало в одном запуске?
DartDart · Состояние и проверка формы · семантика
final formKey = GlobalKey<FormState>();

Future<void> submit() async {
  if (!(formKey.currentState?.validate() ?? false)) return;
  formKey.currentState!.save();
  await account.update();
}

// Контекст задания: проверка семантики фрагмента.
Вопрос 9 из 25
Как сформулировать публичное обещание темы «Состояние и проверка формы», не привязывая клиента к конкретному классу?
Вопрос 10 из 25
Перед обновлением зависимости нужно защитить исправление «Состояние и проверка формы». Какая проверка подходит лучше всего?
Вопрос 11 из 25
Текущая защита работает лишь в одном сценарии. Что следует изменить в самом решении по теме «Асинхронная проверка»?
DartDart · Асинхронная проверка · исправление
int validationRevision = 0;

Future<void> validateName(String value) async {
  final revision = ++validationRevision;
  final result = await accounts.checkName(value.trim());
  if (!mounted || revision != validationRevision) return;
  setState(() => nameError = result.error);
}

// Контекст задания: выбор места исправления.
Вопрос 12 из 25
Какое утверждение корректно связывает показанный код с семантикой темы «Асинхронная проверка»?
DartDart · Асинхронная проверка · семантика
int validationRevision = 0;

Future<void> validateName(String value) async {
  final revision = ++validationRevision;
  final result = await accounts.checkName(value.trim());
  if (!mounted || revision != validationRevision) return;
  setState(() => nameError = result.error);
}

// Контекст задания: проверка семантики фрагмента.
Вопрос 13 из 25
Код проходит обычный сценарий. Какие проверки по теме «Асинхронная проверка» нужны, чтобы разные граничные исходы не слились в один?
DartDart · Асинхронная проверка · границы
int validationRevision = 0;

Future<void> validateName(String value) async {
  final revision = ++validationRevision;
  final result = await accounts.checkName(value.trim());
  if (!mounted || revision != validationRevision) return;
  setState(() => nameError = result.error);
}

// Контекст задания: анализ граничных входов.
Вопрос 14 из 25
Ручная проверка по теме «Асинхронная проверка» прошла. Как превратить её в полезную автоматическую регрессию?
Вопрос 15 из 25
Как сформулировать публичное обещание темы «Асинхронная проверка», не привязывая клиента к конкретному классу?
Вопрос 16 из 25
Для показанного решения написали один тест на успех. Какой набор граничных сценариев по теме «Сообщения пользователю» должен появиться рядом?
DartDart · Сообщения пользователю · границы
Future<void> submit() async {
  setState(() => submitting = true);
  try {
    await account.updateEmail(controller.text.trim());
    if (mounted) showMessage(context, 'Address updated');
  } on EmailAlreadyUsed {
    if (mounted) setState(() => emailError = 'This address is already used');
  } finally {
    if (mounted) setState(() => submitting = false);
  }
}

// Контекст задания: анализ граничных входов.
Вопрос 17 из 25
Текущая защита работает лишь в одном сценарии. Что следует изменить в самом решении по теме «Сообщения пользователю»?
DartDart · Сообщения пользователю · исправление
Future<void> submit() async {
  setState(() => submitting = true);
  try {
    await account.updateEmail(controller.text.trim());
    if (mounted) showMessage(context, 'Address updated');
  } on EmailAlreadyUsed {
    if (mounted) setState(() => emailError = 'This address is already used');
  } finally {
    if (mounted) setState(() => submitting = false);
  }
}

// Контекст задания: выбор места исправления.
Вопрос 18 из 25
Какое утверждение корректно связывает показанный код с семантикой темы «Сообщения пользователю»?
DartDart · Сообщения пользователю · семантика
Future<void> submit() async {
  setState(() => submitting = true);
  try {
    await account.updateEmail(controller.text.trim());
    if (mounted) showMessage(context, 'Address updated');
  } on EmailAlreadyUsed {
    if (mounted) setState(() => emailError = 'This address is already used');
  } finally {
    if (mounted) setState(() => submitting = false);
  }
}

// Контекст задания: проверка семантики фрагмента.
Вопрос 19 из 25
Две реализации решают задачу «Сообщения пользователю» по-разному. Какое требование делает их взаимозаменяемыми для клиента?
Вопрос 20 из 25
Ручная проверка по теме «Сообщения пользователю» прошла. Как превратить её в полезную автоматическую регрессию?
Вопрос 21 из 25
Обычный путь в коде зелёный. Как построить проверку «Тестовый сценарий», чтобы не пропустить различия между отказами?
DartDart · Тестовый сценарий · границы
testWidgets('prevents a second submit while request is pending', (tester) async {
  final gateway = Completer<void>();
  await tester.pumpWidget(TestApp(form: EmailForm(save: () => gateway.future)));
  await tester.tap(find.text('Save'));
  await tester.tap(find.text('Save'));
  expect(find.byType(CircularProgressIndicator), findsOneWidget);
});

// Контекст задания: анализ граничных входов.
Вопрос 22 из 25
Что здесь следует считать правилом «Тестовый сценарий», а что — лишь деталью текущей реализации?
DartDart · Тестовый сценарий · семантика
testWidgets('prevents a second submit while request is pending', (tester) async {
  final gateway = Completer<void>();
  await tester.pumpWidget(TestApp(form: EmailForm(save: () => gateway.future)));
  await tester.tap(find.text('Save'));
  await tester.tap(find.text('Save'));
  expect(find.byType(CircularProgressIndicator), findsOneWidget);
});

// Контекст задания: проверка семантики фрагмента.
Вопрос 23 из 25
Текущая защита работает лишь в одном сценарии. Что следует изменить в самом решении по теме «Тестовый сценарий»?
DartDart · Тестовый сценарий · исправление
testWidgets('prevents a second submit while request is pending', (tester) async {
  final gateway = Completer<void>();
  await tester.pumpWidget(TestApp(form: EmailForm(save: () => gateway.future)));
  await tester.tap(find.text('Save'));
  await tester.tap(find.text('Save'));
  expect(find.byType(CircularProgressIndicator), findsOneWidget);
});

// Контекст задания: выбор места исправления.
Вопрос 24 из 25
Какая регрессия для «Тестовый сценарий» будет падать на старом дефекте и не ломаться от безопасной перестройки кода?
Вопрос 25 из 25
Две реализации решают задачу «Тестовый сценарий» по-разному. Какое требование делает их взаимозаменяемыми для клиента?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу