Skip to content

Test failing because of template's content in SFC #235

@Edmund1645

Description

@Edmund1645

I'm beginning to write unit tests for a project and the first test suite I'm writing is failing with this error:

Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side-effects in your templates, such as <style>, as they
 will not be parsed.

But I've tried remove ing the <style></style> tag and it still fails. The only thing that solved it was removing the contents of <template></template> and leaving the root node element.

This is the full error I get.

 FAIL  __tests__/SideBar.spec.js
  ● Test suite failed to run


    [vue-jest] Error: Vue template compilation failed

      at error (node_modules/vue-jest/lib/throw-error.js:2:9)
      at compileTemplate (node_modules/vue-jest/lib/template-compiler.js:29:5)
      at Object.module.exports [as process] (node_modules/vue-jest/lib/process.js:66:29)
      at ScriptTransformer.transformSource (node_modules/@jest/transform/build/ScriptTransformer.js:479:35)
      at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:569:40)
      at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:609:25)

my SideBar.vue component:

<template>
  <div
    id="sidebar"
    class="h-full md:w-1/3 lg:w-1/5 xl:w-3/13 fixed bg-m-army-green"
  >
    <div
      id="borrower-id"
      class="p-3 w-9/12 mx-auto mt-10 border rounded-lg border-m-army-green-lighter"
    >
      <h3 class="text-white text-3xl font-medium inline-block ml-3 mb-0">
        {{ businessInitials }}
      </h3>
      <p class="ml-3 -mt-2 text-sm text-gray-500">ID: {{ userId }}</p>
    </div>

    <!-- conditionally render the sidebar navigation -->
    <div v-if="!onboardingScreen" id="menu-buttons">
      <div
        id="menus"
        class="grid grid-cols-3 w-10/12 gap-4 row-gap-10 mt-20  mx-auto"
      >
        <div class="flex flex-col content-center">
          <nuxt-link
            to="/dashboard"
            tag="button"
            class="w-12 h-12 xl:h-16 xl:w-16 mx-auto rounded-md border border-gray-700 p-3 focus:outline-none disabled:cursor-not-allowed sidebar-button-link"
            :disabled="onboardingScreen"
          >
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62.99 60.23">
              <defs>
                <style>
                  .cls-1 {
                    fill: #68717a;
                  }
                  button.nuxt-link-exact-active:not([disabled]) .cls-1 {
                    fill: #02cb63;
                  }
                </style>
              </defs>
              <title>Home</title>
              <g id="Layer_2" data-name="Layer 2">
                <g id="Layer_1-2" data-name="Layer 1">
                  <path
                    class="cls-1"
                    d="M49.06,54.23H14.22V26.59h-6V56.17a4.06,4.06,0,0,0,4.06,4.06H51a4.06,4.06,0,0,0,4.06-4.06V26.59h-6Z"
                  />
                  <path
                    class="cls-1"
                    d="M34,.77a4.05,4.05,0,0,0-4.74,0L0,21.66l3.49,4.88L31.64,6.45,59.47,26.54,63,21.67Z"
                  />
                  <path
                    class="cls-1"
                    d="M42.52,49.93V36a4,4,0,0,0-3.92-4.06H24.68A4,4,0,0,0,20.77,36v14h6v-12h9.75v12Z"
                  />
                </g>
              </g>
            </svg>
          </nuxt-link>
          <p class="text-white text-center mt-2 text-md sidebar-labels">Home</p>
        </div>
        <div class="flex flex-col content-center">
          <nuxt-link
            to="/dashboard/wallet"
            tag="button"
            class="w-12 h-12 xl:h-16 xl:w-16 mx-auto rounded-md border border-gray-700 p-3 focus:outline-none disabled:cursor-not-allowed sidebar-button-link"
            :disabled="onboardingScreen"
          >
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58.88 52.7">
              <defs>
                <style>
                  .cls-1 {
                    fill: #68717a;
                  }
                  button.nuxt-link-exact-active:not([disabled]) .cls-1 {
                    fill: #02cb63;
                  }
                </style>
              </defs>
              <title>Wallet</title>
              <g id="Layer_2" data-name="Layer 2">
                <g id="Layer_1-2" data-name="Layer 1">
                  <path
                    class="cls-1"
                    d="M58.87,9.1A9.11,9.11,0,0,0,49.77,0H19.32a4.25,4.25,0,0,0-4.25,4.25V9.2h6V6h28.7a3.1,3.1,0,0,1,0,6.2H9.22A4.26,4.26,0,0,0,5,16.45v6.72H4.25A4.26,4.26,0,0,0,0,27.42v9.71a4.26,4.26,0,0,0,4.25,4.25H5v7.07A4.25,4.25,0,0,0,9.22,52.7h45.4a4.25,4.25,0,0,0,4.26-4.25V9.1ZM6,35.38V29.17H18.83a3.11,3.11,0,1,1,0,6.21ZM11,46.7V41.38h7.86a9.11,9.11,0,1,0,0-18.21H11v-5h38.8a9.16,9.16,0,0,0,3.11-.55V46.7Z"
                  />
                </g>
              </g>
            </svg>
          </nuxt-link>
          <p class="text-white text-center mt-2 text-md sidebar-labels">
            Wallet
          </p>
        </div>
        <div class="flex flex-col content-center">
          <nuxt-link
            to="/dashboard/transactions"
            tag="button"
            class="w-12 h-12 xl:h-16 xl:w-16 mx-auto rounded-md border border-gray-700 p-3 focus:outline-none disabled:cursor-not-allowed sidebar-button-link"
            :disabled="onboardingScreen"
          >
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 59.3 45.85">
              <defs>
                <style>
                  .cls-1 {
                    fill: #68717a;
                  }
                  button.nuxt-link-exact-active:not([disabled]) .cls-1 {
                    fill: #02cb63;
                  }
                </style>
              </defs>
              <title>Transaction</title>
              <g id="Layer_2" data-name="Layer 2">
                <g id="Layer_1-2" data-name="Layer 1">
                  <path
                    class="cls-1"
                    d="M46.19,28.38v-24A4.37,4.37,0,0,0,41.83,0H4.37A4.37,4.37,0,0,0,0,4.37v24a4.37,4.37,0,0,0,4.37,4.37H41.83A4.37,4.37,0,0,0,46.19,28.38ZM40.19,6v4.26H6V6ZM6,26.75V16.26H40.19V26.75Z"
                  />
                  <path
                    class="cls-1"
                    d="M54.93,13.11H49.75v6H53.3V39.85H19.11V36h-6v5.46a4.36,4.36,0,0,0,4.36,4.36H54.93a4.37,4.37,0,0,0,4.37-4.36v-24A4.37,4.37,0,0,0,54.93,13.11Z"
                  />
                </g>
              </g>
            </svg>
          </nuxt-link>
          <p class="text-white text-center mt-2 text-md sidebar-labels">
            Transactions
          </p>
        </div>
        <div class="flex flex-col content-center">
          <nuxt-link
            to="/dashboard/report"
            tag="button"
            class="w-12 h-12 xl:h-16 xl:w-16 mx-auto rounded-md border border-gray-700 p-3 focus:outline-none disabled:cursor-not-allowed sidebar-button-link"
            :disabled="onboardingScreen"
          >
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 51.68 56.96">
              <defs>
                <style>
                  .cls-1 {
                    fill: #68717a;
                  }
                  button.nuxt-link-exact-active:not([disabled]) .cls-1 {
                    fill: #02cb63;
                  }
                </style>
              </defs>
              <title>Report</title>
              <g id="Layer_2" data-name="Layer 2">
                <g id="Layer_1-2" data-name="Layer 1">
                  <path
                    class="cls-1"
                    d="M47.43,0H17.52a4.26,4.26,0,0,0-2.85,1.1L1.4,13.08A4.24,4.24,0,0,0,0,16.23V52.71A4.26,4.26,0,0,0,4.25,57H47.43a4.25,4.25,0,0,0,4.25-4.25V4.25A4.25,4.25,0,0,0,47.43,0ZM45.68,51H6V17L18.19,6H45.68Z"
                  />
                  <rect
                    class="cls-1"
                    x="11.82"
                    y="16.47"
                    width="12.04"
                    height="6"
                    transform="translate(-0.12 0.11) rotate(-0.35)"
                  />
                  <rect
                    class="cls-1"
                    x="11.82"
                    y="29.89"
                    width="22.88"
                    height="6"
                    transform="translate(-0.11 0.07) rotate(-0.18)"
                  />
                  <rect
                    class="cls-1"
                    x="11.82"
                    y="39.03"
                    width="22.88"
                    height="6"
                    transform="translate(-0.11 0.06) rotate(-0.15)"
                  />
                </g>
              </g>
            </svg>
          </nuxt-link>
          <p class="text-white text-center mt-2 text-md sidebar-labels">
            Report
          </p>
        </div>
        <div class="flex flex-col content-center">
          <nuxt-link
            to="/dashboard/pending"
            tag="button"
            class="w-12 h-12 xl:h-16 xl:w-16 mx-auto rounded-md border border-gray-700 p-3 focus:outline-none disabled:cursor-not-allowed sidebar-button-link"
            :disabled="onboardingScreen"
          >
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 49.37 58.34">
              <defs>
                <style>
                  .cls-1 {
                    fill: #68717a;
                  }
                  button.nuxt-link-exact-active:not([disabled]) .cls-1 {
                    fill: #02cb63;
                  }
                </style>
              </defs>
              <title>Pending</title>
              <g id="Layer_2" data-name="Layer 2">
                <g id="Layer_1-2" data-name="Layer 1">
                  <rect class="cls-1" x="12.46" width="23.57" height="6" />
                  <path
                    class="cls-1"
                    d="M49.37,14.47l-4.24-4.24-5.31,5.31a24.24,24.24,0,1,0,4.08,4.39ZM24.24,52.34A18.25,18.25,0,1,1,42.48,34.09,18.27,18.27,0,0,1,24.24,52.34Z"
                  />
                  <path
                    class="cls-1"
                    d="M27.24,29.21V23.72h-6v5.49a5.74,5.74,0,1,0,6,0ZM24,34.09a.27.27,0,0,1,.53,0C24.51,34.38,24,34.38,24,34.09Z"
                  />
                </g>
              </g>
            </svg>
          </nuxt-link>
          <p class="text-white text-center mt-2 text-md sidebar-labels">
            Pending
          </p>
        </div>
        <div class="flex flex-col content-center">
          <nuxt-link
            to="/dashboard/approved"
            tag="button"
            class="w-12 h-12 xl:h-16 xl:w-16 mx-auto rounded-md border border-gray-700 p-3 focus:outline-none disabled:cursor-not-allowed sidebar-button-link"
            :disabled="onboardingScreen"
          >
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.88 60.23">
              <defs>
                <style>
                  .cls-1 {
                    fill: #68717a;
                  }
                  button.nuxt-link-exact-active:not([disabled]) .cls-1 {
                    fill: #02cb63;
                  }
                </style>
              </defs>
              <title>Approved</title>
              <g id="Layer_2" data-name="Layer 2">
                <g id="Layer_1-2" data-name="Layer 1">
                  <path
                    class="cls-1"
                    d="M6,6H44V23.6h6V3.91A3.92,3.92,0,0,0,46.1,0H3.91A3.91,3.91,0,0,0,0,3.91V51.63a3.92,3.92,0,0,0,3.91,3.91H19.26v-6H6V40.9H19.26v-6H6Z"
                  />
                  <path
                    class="cls-1"
                    d="M39.38,27.23a16.5,16.5,0,1,0,16.5,16.5A16.52,16.52,0,0,0,39.38,27.23Zm0,27a10.5,10.5,0,1,1,10.5-10.5A10.51,10.51,0,0,1,39.38,54.23Z"
                  />
                  <polygon
                    class="cls-1"
                    points="38.11 43.02 35.69 40.6 31.45 44.85 38.11 51.51 47.3 42.31 43.06 38.07 38.11 43.02"
                  />
                </g>
              </g>
            </svg>
          </nuxt-link>
          <p class="text-white text-center mt-2 text-md sidebar-labels">
            Approved
          </p>
        </div>
      </div>
      <button
        class="block font-medium text-lg focus:outline-none bg-m-green text-white w-5/6 mx-auto py-3 mt-6 rounded-sm disabled:bg-gray-700 disabled:text-white disabled:cursor-not-allowed"
        :disabled="onboardingScreen"
      >
        Request Loan
      </button>
    </div>

    <!-- Empty sidebar -->
    <div v-else id="blank-menu">
      <div
        id="menus"
        class="grid grid-cols-3 w-10/12 gap-4 row-gap-10 mt-20  mx-auto"
      >
        <div class="menu-item">
          <div
            class="w-12 h-12 xl:w-16 xl:h-16 mx-auto rounded md bg-m-gray-darker opacity-50"
          ></div>
          <div
            class="menu-item-text h-3 w-12 xl:w-16 rounded-full mt-3 mx-auto bg-m-gray-darker opacity-50"
          ></div>
        </div>
        <div class="menu-item">
          <div
            class="w-12 h-12 xl:w-16 xl:h-16 mx-auto rounded-md bg-m-gray-darker opacity-50"
          ></div>
          <div
            class="menu-item-text h-3 w-12 xl:w-16 rounded-full mt-3 mx-auto bg-m-gray-darker opacity-50"
          ></div>
        </div>
        <div class="menu-item">
          <div
            class="w-12 h-12 xl:w-16 xl:h-16 mx-auto rounded-md bg-m-gray-darker opacity-50"
          ></div>
          <div
            class="menu-item-text h-3 w-12 xl:w-16 rounded-full mt-3 mx-auto bg-m-gray-darker opacity-50"
          ></div>
        </div>
        <div class="menu-item">
          <div
            class="w-12 h-12 xl:w-16 xl:h-16 mx-auto rounded-md bg-m-gray-darker opacity-50"
          ></div>
          <div
            class="menu-item-text h-3 w-12 xl:w-16 rounded-full mt-3 mx-auto bg-m-gray-darker opacity-50"
          ></div>
        </div>
        <div class="menu-item">
          <div
            class="w-12 h-12 xl:w-16 xl:h-16 mx-auto rounded-md bg-m-gray-darker opacity-50"
          ></div>
          <div
            class="menu-item-text h-3 w-12 xl:w-16 rounded-full mt-3 mx-auto bg-m-gray-darker opacity-50"
          ></div>
        </div>
        <div class="menu-item">
          <div
            class="w-12 h-12 xl:w-16 xl:h-16 mx-auto rounded-md bg-m-gray-darker opacity-50"
          ></div>
          <div
            class="menu-item-text h-3 w-12 xl:w-16 rounded-full mt-3 mx-auto bg-m-gray-darker opacity-50"
          ></div>
        </div>
      </div>
      <div
        class="bg-m-gray-darker opacity-50 w-5/6 mx-auto py-6 mt-8 rounded-sm "
      ></div>
    </div>
    <div id="support" class="px-6 mt-16">
      <button class="block focus:outline-none py-3 my-5 text-white font-medium">
        <img
          src="~/assets/vectors/ui/sidebar/unknown.svg"
          alt=""
          width="35px"
          class="inline-block"
        />
        Help
      </button>
      <button class="block focus:outline-none py-3 my-5 text-white font-medium">
        <img
          src="~/assets/vectors/ui/sidebar/settings.svg"
          alt=""
          width="35px"
          class="inline-block"
        />
        Settings
      </button>
    </div>
  </div>
</template>
<script>
export default {
  name: 'SideBar',
  props: {
    onboardingScreen: {
      type: Boolean,
      default: false
    },
    businessInitials: {
      type: String,
      required: true
    },
    userId: {
      type: Number,
      required: true
    }
  }
}
</script>
<style lang="postcss" scoped>
button.nuxt-link-exact-active:not([disabled]) {
  border-color: #02cb63;
}
button.sidebar-button-link:disabled + p.sidebar-labels {
  color: #68717a;
}
</style>

In Sidebar.spec.js file

import { shallowMount } from '@vue/test-utils'
import SideBar from '@/components/dashboards/SideBar.vue'

describe('SideBar.vue', () => {
  let wrapper
  beforeEach(() => {
    wrapper = shallowMount(SideBar, {
      propsData: {
        userId: 900,
        businessInitials: 'Mandango'
      }
    })
  })
  it('should render a blank menu when onboardingScreen prop is true', () => {
    wrapper.setProps({ onboardingScreen: true })
    expect(wrapper.vm.onboardingScreen).toBe(true)
    expect(wrapper.find('div#menu-buttons').exists()).toBe(false)
    expect(wrapper.find('div#blank-menu').exists()).toBe(true)
  })
})

here's my jest config in package.json

 "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "vue"
    ],
    "moduleNameMapper": {
      "^@/(.*)$": "<rootDir>/$1",
      "^~/(.*)$": "<rootDir>/$1"
    },
    "transform": {
      ".*\\.(vue)$": "vue-jest",
      "^.+\\.js$": "babel-jest"
    }
  }

I noticed removing all inline SVGs seemed to make the error gone but I need the interactivity of the icons so I cannot use plain img tags.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions