quasar-testing icon indicating copy to clipboard operation
quasar-testing copied to clipboard

Mocking this.$q.notify results in TypeError: this.$q.notify is not a function

Open khteh opened this issue 2 years ago • 1 comments

I am trying to mock the this.$q.notify but have not had any luck. I have asked in Discord but no response.

beforeEach(() => {
    wrapper = mount(CartView, {
      global: { plugins: [Store], provide: qLayoutInjections() },
      mocks: {
        $q: {
          notify: jest.fn()
       },
      }
    });
});

And get this error during test:

          this.$q.notify({
                  ^

TypeError: this.$q.notify is not a function

How can I successfully mock this.$q.notify? Thanks.

Software version

OS: Ubuntu 21.10 Node: v17.8.0 NPM: 8.5.5 Any other software related to your bug:

What did you get as the error?

What were you expecting?

What steps did you take, to get the error?

khteh avatar Apr 02 '22 06:04 khteh

I make some changes w.r.t https://test-utils.vuejs.org/migration/#mocks-and-stubs-are-now-in-global

    wrapper = mount(CartView, {
      global: { 
        plugins: [Store], 
        provide: qLayoutInjections(),
        mocks: {
          $q: {
            notify: jest.fn()
          }
        }
      }
    });

and the test crashes:

    console.warn
      [Vue warn]: Unhandled error during execution of render function 
        at <QCard> 
        at <CartView ref="VTU_COMPONENT" > 
        at <VTUROOT>

      at warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:40:17)
      at logError (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:214:9)
      at handleError (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:206:5)
      at renderComponentRoot (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:916:9)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4963:57)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:171:25)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5089:9)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4872:9)

  ● MobileCartView tests › Mobile cart quantity and price tests

    TypeError: Cannot read properties of undefined (reading 'height')

      189 |   }
      190 | };
    > 191 | </script>
          |                                                  ^
      192 |

      at src/components/MobileCartView.vue:191:65
      at e (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:844:21)
      at hSlot (node_modules/quasar/dist/quasar.esm.prod.js:6:25920)
      at Proxy.<anonymous> (node_modules/quasar/dist/quasar.esm.prod.js:6:75007)
      at renderComponentRoot (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:887:44)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4963:57)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:171:25)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5089:9)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4872:9)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4830:17)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4433:21)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4970:21)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:171:25)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5089:9)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4872:9)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4830:17)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4433:21)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4970:21)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:171:25)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5089:9)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4872:9)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4830:17)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:4433:21)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5574:13)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3856:25)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1539:23)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:7919:18)
      at Object.<anonymous> (test/jest/__tests__/components/MobileCartView.test.js:36:22)

khteh avatar Apr 02 '22 06:04 khteh

Still doesn't work for Quasar 2.11.5, Vitest 0.27.1 and "@quasar/quasar-app-extension-testing-unit-vitest": "^0.1.2". I added injections from here and did this:

it('mock a dummy call', async () => {
    const wrap = mount(Dummy, {
      global: {
        provide: qLayoutInjections(),
        mocks: {
          $q: {
            notify: vi.fn(),
          },
        },
      },
    });

    expect(wrap.html()).toContain('Dummy');
    await formInput = wrap.get('[data-test=form-top]').trigger('submit');
    console.log(wrap.emitted());
  });
});

Getting the same error:

 FAIL  test/sfc/dummy.spec.ts > Dummy Component > mock a dummy call
TypeError: Cannot read properties of undefined (reading 'has')
 ❯ ReactiveEffect.fn node_modules/quasar/src/components/btn/QBtn.js:100:31
    101| 
    102|       return {                                                        
    103|         // needed; especially for disabled <a> tags
       |       ^
    104|         onClick: stopAndPrevent
    105|       }
 ❯ ReactiveEffect.run node_modules/@vue/reactivity/dist/reactivity.cjs.js:191:25
 ❯ ComputedRefImpl.get value [as value] node_modules/@vue/reactivity/dist/reactivity.cjs.js:1142:39
 ❯ ReactiveEffect.fn node_modules/quasar/src/components/btn/QBtn.js:122:19
 ❯ ReactiveEffect.run node_modules/@vue/reactivity/dist/reactivity.cjs.js:191:25

drev74 avatar Jan 16 '23 18:01 drev74

Please provide a repro, I don't have the time to reproduce the problem by trial and errors Also, the issue author was apparently referring to a Jest problem (can't be sure, he didn't mention it), while your is a Vitest problem

IlCallo avatar Feb 28 '23 13:02 IlCallo

I solved this problem by mocking $q stuff and forgot about it long ago. Sorry, can't reproduce it anymore :smile_cat:

drev74 avatar Mar 01 '23 11:03 drev74

Thanks for the update! Closing this one then Can you share how you mocked $q stuff successfully?

IlCallo avatar Mar 01 '23 14:03 IlCallo

@IlCallo i did it like this in our nuxt project setup file

installQuasarPlugin({ plugins: { Notify } });

test file:

  const notify = vitest.fn();

  const wrapper = shallowMount(MyComponent, {
    global: {
      provide: {
        _q_: { notify },
      },
    },
  });
// Trigger notify somehow
expect(notify).toHaveBeenCalled();

rubennaatje avatar May 25 '23 13:05 rubennaatje

@IlCallo i did it like this in our nuxt project setup file

installQuasarPlugin({ plugins: { Notify } });

test file:

  const notify = vitest.fn();

  const wrapper = shallowMount(MyComponent, {
    global: {
      provide: {
        _q_: { notify },
      },
    },
  });
// Trigger notify somehow
expect(notify).toHaveBeenCalled();

I am currently looking for a clean solution to test Quasar components in a Nuxt 3 project. How have you integrated quasar-testing into your Nuxt code base?

I would appreciate a short feedback.

Best

maximilianfixl avatar Sep 21 '23 16:09 maximilianfixl