Lusito / mockzilla-webextension

A mocking toolkit for web-extensions leveraging the power of TypeScript to enhance your jest experience.

Home Page:https://lusito.github.io/mockzilla-webextension/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Expect a mock node, but found a mock value at browser.runtime.onMessage

kabeleced77 opened this issue · comments

Following code shall be tested:

import browser from 'webextension-polyfill'

export default class OneOffMessaging<TReceive, TReply> {
  public handle(handleMessage: (message: TReceive, sender?: browser.Runtime.MessageSender) => Promise<TReply>): void {
    browser.runtime.onMessage.addListener(handleMessage)
  }
}

For the first unit test I use following setup following the guidlines from here:

import { deepMock } from 'mockzilla'
import { mockEvent, MockzillaEventOf } from 'mockzilla-webextension'
import { Runtime } from 'webextension-polyfill'
import OneOffMessaging from './GithubOneOffMessaging'

describe('OneOffMessaging', () => {
  const [messageSender, mockMessageSender, mockMessageSenderNode] = deepMock<Runtime.MessageSender>('messageSender')
  let addListenerOnMessage: MockzillaEventOf<typeof mockBrowser.runtime.onMessage>
  const mockMessageSenderFrame = 456
  const mockMessageSenderId = '123'
  const mockMessageSenderUrl = 'url'
  const msg01 = 'message-in-unit-test'

  beforeEach(() => {
    addListenerOnMessage = mockEvent(mockBrowser.runtime.onMessage)
    mockMessageSenderNode.enable()
    mockMessageSender.frameId?.mock(mockMessageSenderFrame)
    mockMessageSender.id?.mock(mockMessageSenderId)
    mockMessageSender.url?.mock(mockMessageSenderUrl)
  })

  afterEach(() => mockMessageSenderNode.verifyAndDisable())

  describe('OneOffMessaging function test', () => {
    it('message-handling by callback receiving message and messageSender-data; no reply', async () => {
      const listener = jest.fn()
      mockBrowser.runtime.onMessage.addListener.expect(listener, expect.anything())
      const sut = new OneOffMessaging<string, void>()
      sut.handle(listener)
      addListenerOnMessage.emit(msg01, messageSender)
    })
  })
})

Executing the unit test leads to following output:

Expect a mock node, but found a mock value at browser.runtime.onMessage

  Invocation:
        26 |     it('message-handling by callback receiving message and messageSender-data; no reply', async () => {
        27 |       const listener = jest.fn()
      > 28 |       mockBrowser.runtime.onMessage.addListener.expect(listener, expect.anything())
           |                                                 ^
        29 |       const sut = new OneOffMessaging<string, void>()
        30 |       sut.handle(listener)
        31 |       addListenerOnMessage.emit(msg01, messageSender)

What is wrong? Thank you