angular / angular/angular-cli

SchematicTestRunner: ability to run scheduled tasks

Aberta
#11,739 0 comentários 1 reação 0 responsáveis Ver no GitHub
area: @angular-devkit/schematics feature
Linguagem predominante
TypeScript
Estrelas
27k
Forks
11.8k
Merge médio
14h 23min
PRs com merge (30d)
162

Descrição

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

Guia de contribuição

Abrir o guia de contribuição

Direção de pesquisa

Comece pela implementação de SchematicTestRunner e pelo caminho de agendamento de tarefas em torno de context.addTask e runner.engine.executePostTasks(); inspecione como RunSchematicTask usa o fluxo de trabalho do engine. Considera-se concluído quando os testes puderem executar apenas tarefas agendadas com um nome selecionado, ou quando RunSchematicTask funcionar em SchematicTestRunner, com cobertura para o comportamento compatível.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
typescript
Domínio
testing, tooling
Tipo de issue
Funcionalidade
Dificuldade
4/5
Tempo estimado
3-5 dias
Status de atividade
Estagnada
Clareza
Razoavelmente clara
Facilidade para iniciantes
35/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.