Я пытаюсь протестировать приложение, которое перемещается по маршрутизатору каждый раз, когда пользователь меняет значение элемента <select>
.Я использовал [ngModel]
и (ngModelChange)
для элемента, чтобы поймать выбранное значение.
Я пытался использовать click()
для <option>
PageLoaderElement
, но безрезультатно.
lib / src / line / lines_component.html:
<h2>Lines</h2>
<div *ngIf="lines?.isNotEmpty">
Select line:
<select [ngModel]="selectedLine" (ngModelChange)="changeLine($event)">
<option disabled selected [ngValue]="nullLine"> -- select an option -- </option>
<option *ngFor="let line of lines" [ngValue]="line">{{line.name}}</option>
</select>
</div>
<div *ngIf="lines?.isEmpty">
No lines available!
</div>
<router-outlet [routes]="Routes.all"></router-outlet>
lib / src / line / lines_component.dart:
Future<NavigationResult> changeLine(Line line) =>
_router.navigate(_lineUrl(line.id));
test / lines_po.dart:
@ByTagName('option')
List<PageLoaderElement> get _lines;
Future<void> selectLine(var target) async {
final lineOpt =
_lines.firstWhere((line) => line.visibleText == target.name);
await lineOpt.click();
}
test / lines.dart:
void selectedLineTests(InjectorProbe injector) {
final targetLine = Line(0, 'Line 0'); // id = 0, name = 'Line 0'
setUp(() async {
await po.selectLine(targetLine);
await fixture.update();
});
test('has navigated to detail', () async {
final mockLocation = injector.get<MockPlatformLocation>(PlatformLocation);
expect(
mockLocation.pathname,
RoutePaths.line
.toUrl(parameters: {idParam: '${targetLine.id}'}).toString()); // '/lines/0'
});
}
Результаты теста (из консоли в браузере):
Expected: '/lines/0'
Actual: ''
Which: is different. Both strings start the same, but the actual value is missing the following trailing characters: /lines/0
ОБНОВЛЕНИЕ :
Кажется, проблема связана с маршрутизатором, а не сэлемент click()
на <option>
.Я следовал руководству на сайте Webdev Dartlang .
Изменение кода для печати результата навигации:
void _selectLine(int id) async {
var res = await _router.navigate(_lineUrl(id));
print(res);
}
Во время теста он печатает: NavigationResult.INVALID_ROUTE
.
Я не знаю, помогает ли это, но мои маршруты организованы так:
lib / src / route_paths.dart:
import 'package:angular_router/angular_router.dart';
const idParam = 'id';
class RoutePaths {
static final lines = RoutePath(path: 'lines');
}
lib / src / rout.dart:
import 'not_found_component.template.dart' as not_found_template;
import 'line/lines_component.template.dart' as lines_template;
import 'route_paths.dart';
export 'route_paths.dart';
class Routes {
static final lines = RouteDefinition(
routePath: RoutePaths.lines,
component: lines_template.LinesComponentNgFactory,
);
static final all = <RouteDefinition>[
lines,
RouteDefinition.redirect(
path: '',
redirectTo: RoutePaths.lines.toUrl(),
),
RouteDefinition(
path: '.+',
component: not_found_template.NotFoundComponentNgFactory,
),
];
}
lib / src / line / route_paths.dart:
import 'package:angular_router/angular_router.dart';
import '../route_paths.dart' as _parent;
export '../route_paths.dart' show idParam;
class RoutePaths {
static final line = RoutePath(
path: ':${_parent.idParam}',
parent: _parent.RoutePaths.lines,
);
}
lib / src / line / rout.dart:
import 'package:angular_router/angular_router.dart';
import 'line_component.template.dart' as line_template;
import 'route_paths.dart';
export 'route_paths.dart';
class Routes {
static final line = RouteDefinition(
routePath: RoutePaths.line,
component: line_template.LineComponentNgFactory,
);
static final all = <RouteDefinition>[
line,
];
}