My unit test case started failing when I started running the unit test in mocha from karma, Earlier we were using karma and –browser to run the test case but it was running fine,
1) common/browser-detection
returns the mock object when there is no userAgent:
TypeError: Cannot read property 'navigator' of undefined
at Context.<anonymous> (packages/node_modules/@webex/plugin-meetings/test/unit/spec/common/browser-detection.js:115:41)
at processImmediate (internal/timers.js:464:21)
2) plugin-meetings
meeting index
Public Api Contract
#addMedia
should reject promise if user already in left state:
AssertionError: expected [ReferenceError: navigator is not defined] to be an instance of UserNotJoinedError
at /Users/nswarnka/Documents/Neeraj/Projects/upstream/webex-js-sdk/packages/node_modules/@webex/plugin-meetings/test/unit/spec/meeting/index.js:763:20
Package.json
"test": "node ./tooling/index.js test",
"circleci:local": "circleci local execute -c .circleci/github.config.yml",
test file –
It fails for navigator here, TypeError: Cannot read property ‘navigator’ of undefined
it('returns the mock object when there is no userAgent', () => {
Object.defineProperty(global.window.navigator, 'userAgent', {
get: () => undefined,
configurable: true
});
ReferenceError: navigator is not defined
/**
* proxy to browser navigator.mediaDevices.enumerateDevices()
* @returns {Promise}
*/
Media.getDevices = () => {
if (navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
return navigator.mediaDevices.enumerateDevices();
}
return Promise.reject(new MediaError('enumerateDevices not supported.'));
};
Advertisement
Answer
Accessing global.window.navigator
is an error both in a browser (where global
is not defined) and in Node.js (where there is no global window
object, and also no navigator
).
If that test were to run in a browser, you could just redefine the userAgent
on navigator
(or equivalently window.navigator
), i.e.
Object.defineProperty(navigator, 'userAgent', {
get: () => undefined,
configurable: true
});
But if you run that test in Node.js without a DOM emulation setup you will run into an error because navigator
is undefined. You could mock navigator
of course before mocking userAgent
, but then for your test to pass you would also need to mock navigator.mediaDevices
and navigator.mediaDevices.enumerateDevices
, and in the end you would test nothing but the mock code itself.
Conclusion: use DOM emulation (JSDom, cheerio) or run your test in a real browser with Karma or Puppeteer.