[IMP] app: throw error when static components key is missing in parent

This commit improves the error message that's thrown when a static
component definition is missing, as outlined in issue #1286.
This commit is contained in:
tom hunkapiller
2022-10-29 14:12:49 -05:00
committed by Sam Degueldre
parent 620e41daa1
commit 3d49daedcd
3 changed files with 39 additions and 1 deletions
+7 -1
View File
@@ -151,7 +151,13 @@ export class App<
} else { } else {
// new component // new component
if (isStatic) { if (isStatic) {
C = parent.constructor.components[name as any]; const components = parent.constructor.components;
if (!components) {
throw new OwlError(
`Cannot find the definition of component "${name}", missing static components key in parent`
);
}
C = components[name as any];
if (!C) { if (!C) {
throw new OwlError(`Cannot find the definition of component "${name}"`); throw new OwlError(`Cannot find the definition of component "${name}"`);
} else if (!(C.prototype instanceof Component)) { } else if (!(C.prototype instanceof Component)) {
@@ -38,6 +38,21 @@ exports[`basics display a nice error if it cannot find component 1`] = `
}" }"
`; `;
exports[`basics display a nice error if the components key is missing with subcomponents 1`] = `
"function anonymous(app, bdom, helpers
) {
let { text, createBlock, list, multi, html, toggler, comment } = bdom;
const comp1 = app.createComponent(\`MissingChild\`, true, false, false, true);
let block1 = createBlock(\`<div><block-child-0/></div>\`);
return function template(ctx, node, key = \\"\\") {
const b2 = comp1({}, key + \`__1\`, node, this, null);
return block1([], [b2]);
}
}"
`;
exports[`basics no component catching error lead to full app destruction 1`] = ` exports[`basics no component catching error lead to full app destruction 1`] = `
"function anonymous(app, bdom, helpers "function anonymous(app, bdom, helpers
) { ) {
+17
View File
@@ -126,6 +126,23 @@ describe("basics", () => {
); );
}); });
test("display a nice error if the components key is missing with subcomponents", async () => {
class Parent extends Component {
static template = xml`<div><MissingChild /></div>`;
}
const app = new App(Parent as typeof Component);
let error: Error;
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
await expect(nextAppError(app)).resolves.toThrow(
'Cannot find the definition of component "MissingChild", missing static components key in parent'
);
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
'Cannot find the definition of component "MissingChild", missing static components key in parent'
);
});
test("simple catchError", async () => { test("simple catchError", async () => {
class Boom extends Component { class Boom extends Component {
static template = xml`<div t-esc="a.b.c"/>`; static template = xml`<div t-esc="a.b.c"/>`;