首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Jest模拟导航器mediaDevices

如何为Jest模拟导航器mediaDevices
EN

Stack Overflow用户
提问于 2020-12-09 20:05:41
回答 2查看 1.9K关注 0票数 2

我有一个需要使用navigator.mediaDevices的测试,但是我不能让任何mock正常工作。

我正在使用create-react-app

这是我的测试:

代码语言:javascript
复制
import getConnectedDevices from "./getConnectedDevices";

describe("getConnectedDevices", () => {
  it("Should work", () => {
    console.log(navigator);              // Navigator {}
    console.log(navigator.mediaDevices); // undefined
  });
});

我曾尝试添加一个mock,因为它显示为here in the jest documentation

代码语言:javascript
复制
// tests/navigator.mock
Object.defineProperty(window, "navigator", {
  writable: true,
  value: {
    mediaDevices: {
      enumerateDevices: jest.fn(),
    },
  },
});
代码语言:javascript
复制
import "../../tests/navigator.mock"; // <- Mock added

import getConnectedDevices from "./getConnectedDevices";

describe("getConnectedDevices", () => {
  it("Should work", () => {
    console.log(navigator);              // Navigator {}
    console.log(navigator.mediaDevices); // undefined
  });
});

我也根据create-react- Initializing the test environment文档尝试过。

代码语言:javascript
复制
// src/setupTests.ts

// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import "@testing-library/jest-dom";

const navigatorMock = {
  mediaDevices: {
    enumerateDevices: jest.fn(),
  },
};

global.navigator = navigatorMock;

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-09 20:11:13

似乎因为已经有一个navigator对象,所以不可能重新分配它。

多亏了this stackoverflow answer,您可以在navigator中模拟对象并将其分配给现有的导航器对象。

代码语言:javascript
复制
// src/setupTests.ts

const mediaDevicesMock = {
  enumerateDevices: jest.fn(),
};

global.navigator.mediaDevices = mediaDevicesMock; // here

注意:这将抛出一个TSC错误Cannot assign to 'mediaDevices' because it is a read-only property.ts(2540)。还在试着弄明白这一点。

票数 1
EN

Stack Overflow用户

发布于 2021-04-26 21:50:00

我用typescript写的:

代码语言:javascript
复制
const mockGetUserMedia = jest.fn(async () => {
    return new Promise<void>(resolve => {
        resolve()
    })
})

Object.defineProperty(global.navigator, 'mediaDevices', {
    value: {
        getUserMedia: mockGetUserMedia,
    },
})
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65216451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档