Schematics: Unit testing a rule that uses mergeWith/apply fails due to missing context
- Vorherrschende Sprache
- TypeScript
- Sterne
- 27k
- Forks
- 11.8k
- Ø Merge
- 14 Std. 23 Min.
- Gemergte PRs (30 T.)
- 162
Beschreibung
## 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"
Beitragsleitfaden
Rechercherichtung
Beginne mit der verknüpften minimalen Reproduktion und dem Unit-Test, der callRule, mergeWith und apply verwendet. Verfolge den gemeldeten Fehler durch file-system-engine-host-base.js und den Einstiegspunkt schematics url.js und achte dabei auf den weggelassenen partialContext. Die Umsetzung sollte den erforderlichen Kontext herstellen und entweder den Test bestehen lassen oder den fehlenden Kontext eindeutig melden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- angular, typescript
- Bereich
- devtools, tooling
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 35/100