angular / angular/angular-cli

SchematicTestRunner: ability to run scheduled tasks

Offen
#11,739 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen
area: @angular-devkit/schematics feature
Vorherrschende Sprache
TypeScript
Sterne
27k
Forks
11.8k
Ø Merge
14 Std. 23 Min.
Gemergte PRs (30 T.)
162

Beschreibung

If someone uses the `SchematicTestRunner` and runs a schematic that schedules specific tasks using the `context.addTask` method, those tasks cannot be run in the tests.

I figured that there is a method (`runner.engine.executePostTasks()` that runs **all** scheduled tasks. This is not really helpful though, since there are situations where we only want to run specific tasks and not all scheduled tasks.

This is because some tasks like `RunSchematicTask` depend on a `engine.workflow` that is not set up in the `SchematicTestRunner`. It would be either nice if the `RunSchematicTask` could work properly in the tests, or there is a method that runs tasks with a specific name.

Current workaround:

```ts
/**
* Due to the fact that the Angular devkit does not support running scheduled tasks from a
* schematic that has been launched through the TestRunner, we need to manually find the task
* executor for the given task name and run all scheduled instances.
*
* Note that this means that there can be multiple tasks with the same name. The observable emits
* only when all tasks finished executing.
*/
export function runPostScheduledTasks(runner: SchematicTestRunner, taskName: string) {

const host = runner.engine['_host'] as EngineHost<{}, {}>;
const tasks = runner.engine['_taskSchedulers'] as TaskScheduler[];

return observableFrom(tasks).pipe(
concatMap(scheduler => scheduler.finalize()),
filter(task => task.configuration.name === taskName),
concatMap(task => {
return host.createTaskExecutor(task.configuration.name)
.pipe(concatMap(executor => executor(task.configuration.options, task.context)));
}),
// Only emit the last emitted value because there can be multiple tasks with the same name.
// The observable should only emit a value if all tasks completed.
last()
);
}
```

cc. @jelbourn @hansl

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit der Implementierung von SchematicTestRunner und dem Aufgabenplanungsweg rund um context.addTask und runner.engine.executePostTasks(); untersuche, wie RunSchematicTask den Engine-Workflow verwendet. Die Aufgabe ist erledigt, wenn Tests nur geplante Aufgaben mit einem ausgewählten Namen ausführen können oder RunSchematicTask in SchematicTestRunner funktioniert, mit Abdeckung für das unterstützte Verhalten.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
testing, tooling
Issue-Typ
Feature
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.