diff --git a/packages/runtime-vapor/__tests__/rendererElement.spec.ts b/packages/runtime-vapor/__tests__/rendererElement.spec.ts
new file mode 100644
index 000000000..c33f2cba9
--- /dev/null
+++ b/packages/runtime-vapor/__tests__/rendererElement.spec.ts
@@ -0,0 +1,78 @@
+import { makeRender } from './_utils'
+import { template } from '../src/dom/template'
+
+const define = makeRender()
+
+describe('renderer: element', () => {
+ it('should create an element', () => {
+ const { html } = define({
+ render() {
+ return template(`
`)()
+ },
+ }).render()
+
+ expect(html()).toBe('
')
+ })
+
+ it('should create an element with props', () => {
+ const { html } = define({
+ render() {
+ return template(`
`)()
+ },
+ }).render()
+
+ expect(html()).toBe('
')
+ })
+
+ it('should create an element with direct text children', () => {
+ const { html } = define({
+ render() {
+ return template(`
foo bar`)()
+ },
+ }).render()
+
+ expect(html()).toBe('
foo bar
')
+ })
+
+ it('should create an element with direct text children and props', () => {
+ const { html } = define({
+ render() {
+ return template(`
bar`)()
+ },
+ }).render()
+
+ expect(html()).toBe('
bar
')
+ })
+
+ it.fails('should update an element tag which is already mounted', () => {
+ const { html } = define({
+ render() {
+ return template(`
foo`)()
+ },
+ }).render()
+ expect(html()).toBe('
foo
')
+
+ define({
+ render() {
+ return template(`
foo`)()
+ },
+ }).render()
+ expect(html()).toBe('foo')
+ })
+
+ it.fails('should update element props which is already mounted', () => {
+ const { html } = define({
+ render() {
+ return template(`foo`)()
+ },
+ }).render()
+ expect(html()).toBe('
foo
')
+
+ define({
+ render() {
+ return template(`
foo`)()
+ },
+ }).render()
+ expect(html()).toBe('
foo
')
+ })
+})