angular / angular/angular-cli

SchematicTestRunner: ability to run scheduled tasks

オープン
#11,739 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る
area: @angular-devkit/schematics feature
主要言語
TypeScript
スター
27k
フォーク
11.8k
平均マージ
14時間 23分
マージ済み PR(30日)
162

説明

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

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

SchematicTestRunner の実装と、context.addTask および runner.engine.executePostTasks() 周辺のタスクスケジューリングの経路から始め、RunSchematicTask がエンジンのワークフローをどのように使用しているかを調査します。完了の条件は、テストで選択した名前のスケジュール済みタスクだけを実行できること、または SchematicTestRunner で RunSchematicTask が動作し、サポートされている動作をカバーするテストがあることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
testing, tooling
issue の種類
機能追加
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。