当我尝试用嘲笑嘲笑反应时,我会收到以下错误:
//PlayerService.js
import Sound from 'react-native-sound';
try {
console.log('Sound: ' + JSON.stringify(Sound)); //Sound: {}
_trackPlaying = new Sound('path', Sound.LIBRARY, error => { });
} catch (error) {
console.log('error: ' + JSON.stringify(error)); //error: {}
}
//PlayerService.tests.js
jest.mock('react-native-sound', () => ({
Sound: jest.fn((path, type, callback) => {
})
}));
//package.json
{
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-jest": "^21.2.0",
"babel-plugin-transform-flow-strip-types": "^6.22.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-flow": "^6.23.0",
"flow": "^0.2.3",
"jest": "^21.2.1"
},
"jest": {
"modulePathIgnorePatterns": [
"__mocks__/"
]
},
"dependencies": {
"react-native-sound": "^0.10.4"
}
}
另外,我尝试在具有类似运气的分离文件(__mock__
文件夹)中设置手动模拟:
//__mocks__/react-native-sound.js
const Sound = jest.genMockFromModule('react-native-sound');
Sound = (path, type, callback) => {
console.log("mocked");
}
module.exports = Sound;
//__tests__/PlayerService.tests.js
jest.mock('react-native-sound'); // doesn't work
任何指导或建议将不胜感激。预先感谢!
好吧,我最终发现了问题。
我试图制作模拟的方式是问题,所以我所做的就是返回一个新功能,模拟我需要模拟的内容:
jest.mock('react-native-sound', () => {
var _filename = null;
var _basePath = null;
var SoundMocked = (filename, basePath, onError, options) => {
_filename = filename;
_basePath = basePath;
onError();
}
SoundMocked.prototype.filename = () => _filename;
SoundMocked.prototype.basePath = () => _basePath;
SoundMocked.prototype.play = function (onEnd) { };
SoundMocked.prototype.pause = function (callback) { };
SoundMocked.prototype.stop = function (callback) { };
SoundMocked.prototype.reset = function () { };
SoundMocked.prototype.release = function () { };
SoundMocked.prototype.getDuration = function () { };
SoundMocked.LIBRARY = 2;
return SoundMocked;
});
您必须模拟所使用的所有功能。您制作的模型并未提供所需的所有功能。您需要模拟声音的构造函数,因为您正在创建声音,您需要模拟声音。另外,您需要制作的模型非常简单,我不会理会使用GenMockFrommodule,这更多的是扩展模块。只需实现一个简单的模拟自己,它就会使您对模块的实际作用有更多的控制。由于您使用的是Babel和ES6,所以我只会嘲笑它作为课程,并模拟您使用的所有功能。
这样的东西。。。
// __mocks__/react-native-sound.js
class Sound {
constructor(path, type, callback) {
...
}
LIBRARY = 1
}
export Sound;
然后在您的测试中
jest.mock('react-native-sound');
我不完全确定在语法上替换反应本地模块的语法(只需确保您的模拟文件夹与您所包含的内容相同的目录),以便您也可能需要要指定您试图像这样替换Modulenamemapper中的模块,然后我不相信您需要在文件中模拟它。但是,只有在您打算在全球范围内嘲笑反应的声音时,这才能起作用。
"moduleNameMapper": {
"react-native-sound": "<rootDir>/__mocks__/react-native-sound.js"
}
现在,如果您有任何不确定的问题,您可以将其添加到模拟类中,并且可以解决该问题。
请注意,如果您喜欢