SchematicTestRunner: ability to run scheduled tasks
- 主要语言
- TypeScript
- 星标
- 27k
- 派生
- 11.8k
- 平均合并
- 14 小时 23 分钟
- 30 天内合并 PR
- 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 如何使用 engine 工作流。完成的标准是测试可以只执行具有选定名称的已调度任务,或者 RunSchematicTask 在 SchematicTestRunner 中正常工作,并为受支持的行为提供覆盖。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- typescript
- 领域
- testing, tooling
- Issue 类型
- 功能
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100