const root = nodeOps.createElement('div')
app.mount(root)
- expect(component1!).toBe(Root) // explicit self name reference
+ expect(component1!).toMatchObject(Root) // explicit self name reference
expect(component2!).toBe(Foo) // successful resolve take higher priority
- expect(component3!).toBe(Root) // fallback when resolve fails
+ expect(component3!).toMatchObject(Root) // fallback when resolve fails
})
describe('warning', () => {
hydrate?: RootHydrateFunction
): CreateAppFunction<HostElement> {
return function createApp(rootComponent, rootProps = null) {
+
+ if (!isFunction(rootComponent)) {
+ rootComponent = { ...rootComponent }
+ }
+
if (rootProps != null && !isObject(rootProps)) {
__DEV__ && warn(`root props passed to app.mount() must be an object.`)
rootProps = null
expect(root.children.length).toBe(1)
expect(root.children[0] instanceof SVGElement).toBe(true)
})
+
+ // #4398
+ test('should not mutate original root component options object', () => {
+
+ const originalObj = {
+ data() {
+ return {
+ counter: 0
+ }
+ }
+ }
+
+ const handler = jest.fn(msg => {
+ expect(msg).toMatch(`Component is missing template or render function`)
+ })
+
+ const Root = { ...originalObj}
+
+ const app = createApp(Root)
+ app.config.warnHandler = handler
+ app.mount(document.createElement('div'))
+
+ // ensure mount is based on a copy of Root object rather than Root object itself
+ expect(app._component).not.toBe(Root)
+
+ // ensure no mutation happened to Root object
+ expect(originalObj).toMatchObject(Root)
+
+ })
})