我有一个需要使用navigator.mediaDevices的测试,但是我不能让任何mock正常工作。
我正在使用create-react-app。
这是我的测试:
import getConnectedDevices from "./getConnectedDevices";
describe("getConnectedDevices", () => {
it("Should work", () => {
console.log(navigator); // Navigator {}
console.log(navigator.mediaDevices); // undefined
});
});我曾尝试添加一个mock,因为它显示为here in the jest documentation
// tests/navigator.mock
Object.defineProperty(window, "navigator", {
writable: true,
value: {
mediaDevices: {
enumerateDevices: jest.fn(),
},
},
});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文档尝试过。
// 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;我做错了什么?
发布于 2020-12-09 20:11:13
似乎因为已经有一个navigator对象,所以不可能重新分配它。
多亏了this stackoverflow answer,您可以在navigator中模拟对象并将其分配给现有的导航器对象。
// 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)。还在试着弄明白这一点。
发布于 2021-04-26 21:50:00
我用typescript写的:
const mockGetUserMedia = jest.fn(async () => {
return new Promise<void>(resolve => {
resolve()
})
})
Object.defineProperty(global.navigator, 'mediaDevices', {
value: {
getUserMedia: mockGetUserMedia,
},
})https://stackoverflow.com/questions/65216451
复制相似问题