💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. В заданиях с кодом опирайтесь на показанный фрагмент и наблюдаемое поведение; в ситуационных — на публичный договор и последствия решения.
Вопрос 1 из 30
Что в поведении этого кода гарантировано правилами темы «Слои», а не случайно совпало в одном запуске?
Dart Dart · Слои · семантика Копировать
final class LoadDashboard {
LoadDashboard(this.orders, this.clock);
final OrderRepository orders;
final Clock clock;
Future<Dashboard> call(UserId user) async {
final items = await orders.recentFor(user, since: clock.now().subtract(const Duration(days: 30)));
return Dashboard.fromOrders(items);
}
}
// Контекст задания: проверка семантики фрагмента.
Случай «зависимость внутреннего слоя от Flutter» объявить внутренней деталью «Слои», даже если клиент видит иной результат.
Порядок внутренних вызовов «Слои» считать публичной гарантией, которую нельзя менять при рефакторинге. Вывод делают по поведению текущей реализации «Слои» на обычном входе.
Спорный результат «Слои» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь. Различия между версиями SDK для «Слои» в этом выводе не учитываются.
Для «Слои» считать случаи «предметное правило в виджете, HTTP-модель в домене и зависимость внутреннего слоя от Flutter» эквивалентными, если программа не завершается аварийно.
Слои разделяют правила предметной области, координацию сценариев и внешние детали; зависимость направляют к устойчивой модели, а не к виджетам и HTTP-клиенту.
Вопрос 12 из 30
Код проходит обычный сценарий. Какие проверки по теме «Доменные модели» нужны, чтобы разные граничные исходы не слились в один?
Dart Dart · Доменные модели · границы Копировать
final class Order {
Order._(this.id, this.lines);
final OrderId id;
final List<OrderLine> lines;
Money get total => lines.fold(Money.zero, (sum, line) => sum + line.total);
static Order create(OrderId id, List<OrderLine> lines) {
if (lines.isEmpty) throw const EmptyOrder();
return Order._(id, List.unmodifiable(lines));
}
}
// Контекст задания: анализ граничных входов.
Развести по отдельным проверкам: транспортное nullable-поле в доменной модели, невозможное сочетание состояний и обход инварианта.
Во всех спорных входах «Доменные модели» проверять только отсутствие необработанного исключения, не сравнивая состояние.
Для «Доменные модели» ограничиться случаем «транспортное nullable-поле в доменной модели», а остальные входы считать тем же классом отказа.
Проверить для «Доменные модели» только самый сложный случай «обход инварианта», считая остальные границы косвенно покрытыми.
Автоматизировать обычный путь «Доменные модели», а случай «обход инварианта» оставить в ручном чек-листе выпуска.
Вопрос 26 из 30
Обычный путь в коде зелёный. Как построить проверку «Стратегия тестирования», чтобы не пропустить различия между отказами?
Dart Dart · Стратегия тестирования · границы Копировать
test('domain rejects an order without lines', () {
expect(() => Order.create(OrderId('o-1'), const []), throwsA(isA<EmptyOrder>()));
});
test('repository maps a server response to a domain order', () async { /* boundary test */ });
// Контекст задания: анализ граничных входов.
Для «Стратегия тестирования» ограничиться случаем «чистое предметное правило», а остальные входы считать тем же классом отказа.
Объединить «чистое предметное правило» и «интеграция границы» в один тест «Стратегия тестирования» с общим ожидаемым исходом.
Проверить независимо друг от друга: чистое предметное правило, интеграция границы, виджетный сценарий и один критичный сквозной путь.
Автоматизировать обычный путь «Стратегия тестирования», а случай «один критичный сквозной путь» оставить в ручном чек-листе выпуска.
Во всех спорных входах «Стратегия тестирования» проверять только отсутствие необработанного исключения, не сравнивая состояние.
Вопрос 27 из 30
Что здесь следует считать правилом «Стратегия тестирования», а что — лишь деталью текущей реализации?
Dart Dart · Стратегия тестирования · семантика Копировать
test('domain rejects an order without lines', () {
expect(() => Order.create(OrderId('o-1'), const []), throwsA(isA<EmptyOrder>()));
});
test('repository maps a server response to a domain order', () async { /* boundary test */ });
// Контекст задания: проверка семантики фрагмента.
Спорный результат «Стратегия тестирования» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь.
Случай «один критичный сквозной путь» объявить внутренней деталью «Стратегия тестирования», даже если клиент видит иной результат.
Порядок внутренних вызовов «Стратегия тестирования» считать публичной гарантией, которую нельзя менять при рефакторинге.
Для «Стратегия тестирования» считать случаи «чистое предметное правило, интеграция границы, виджетный сценарий и один критичный сквозной путь» эквивалентными, если программа не завершается аварийно.
Стратегия тестирования сочетает быстрые тесты правил, проверки интеграции границ и небольшой набор сквозных сценариев, а не пытается всё доказать одним видом теста.