angular / angular/angular-cli

Schematics: Unit testing a rule that uses mergeWith/apply fails due to missing context

Ouverte
#17,205 4 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
area: @angular-devkit/schematics freq1: low severity3: broken type: bug/fix
Langage dominant
TypeScript
Étoiles
27k
Forks
11.8k
Merge moyen
14 h 23 min
PR mergées (30 j)
162

Description

## Addendum

In creating the test case I've realised that I'm not passing a `partialContext` to `callRule`, so it is definitely missing context, however, it is not at all clear _what_ context is necessary for `mergeWith` to succeed and the error does not indicate that context is actually missing.

Happy for this to be marked as a question instead. Guidance on _how_ to provide the context and _what_ context to provide would be amazingly useful.

# 🐞 Bug report

### Description

Using `callRule` to unit test rules within a schematic fails when it comes to rules which return `mergeWith`

## 🔬 Minimal Reproduction

See: https://github.com/jdpearce/schematics-apply-problem

Given a rule which applies template files to the tree, this unit test will fail with `TypeError: Cannot read property 'path' of undefined`:

```ts
describe('applyTemplateFiles Rule', () => {
let tree: UnitTestTree;

beforeEach(async () => {
tree = new UnitTestTree(Tree.empty());
});

it('should apply the files to the tree', async () => {
const schema = {};

tree = (await callRule(applyTemplateFiles(schema), tree)) as UnitTestTree;

expect(tree.files).toEqual(jasmine.arrayContaining(['/libs/destination/test.txt']));
});
});
```

## 🔥 Exception or Error

```bash
Failures:
1) applyTemplateFiles Rule should apply the files to the tree
Message:
TypeError: Cannot read property 'path' of undefined
Stack:
at
at ./apply-problem/node_modules/@angular-devkit/schematics/tools/file-system-engine-host-base.js:216:96
at ./tmp/apply-problem/node_modules/@angular-devkit/schematics/src/rules/url.js:13:73
at Object.callSource (./tmp/apply-problem/node_modules/@angular-devkit/schematics/src/rules/call.js:55:20)
at ./tmp/apply-problem/node_modules/@angular-devkit/schematics/src/rules/base.js:45:60
at Object.callSource (./tmp/apply-problem/node_modules/@angular-devkit/schematics/src/rules/call.js:55:20)
at ./tmp/apply-problem/node_modules/@angular-devkit/schematics/src/rules/base.js:53:23
at MergeMapSubscriber.project (./tmp/apply-problem/node_modules/@angular-devkit/schematics/src/rules/call.js:74:24)
at MergeMapSubscriber._tryNext (./tmp/apply-problem/node_modules/rxjs/internal/operators/mergeMap.js:69:27)
at MergeMapSubscriber._next (./tmp/apply-problem/node_modules/rxjs/internal/operators/mergeMap.js:59:18)
at MergeMapSubscriber.Subscriber.next (./tmp/apply-problem/node_modules/rxjs/internal/Subscriber.js:66:18)

2 specs, 1 failure
```

## 🌍 Your Environment

"@angular-devkit/core": "^9.0.6",
"@angular-devkit/schematics": "^9.0.6",
"@types/jasmine": "^3.3.9",
"@types/node": "^8.0.31",
"jasmine": "^3.3.1",
"typescript": "~3.5.3"

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par la reproduction minimale liée et le test unitaire qui utilise callRule, mergeWith et apply. Suivez l’échec signalé à travers file-system-engine-host-base.js et le point d’entrée schematics url.js, en prêtant attention au partialContext omis. L’implémentation doit établir le contexte requis et soit faire réussir le test, soit signaler clairement le contexte manquant.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
angular, typescript
Domaine
devtools, tooling
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.