我一直在尝试将jest设置为我正在使用Phaser的项目的测试框架,而试图模拟Phaser本身却陷入困境。我首先遇到缺少画布的this issue,可以从链接中解决该问题。但是现在我又遇到了另一个错误“无法读取未定义的属性'位置'”。
jest.config.js:
module.exports = {
verbose: true,
roots: ['./src'],
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
moduleNameMapper: {
'\\.(css|less|scss)$': 'identity-obj-proxy'
},
setupFiles: ['jest-canvas-mock']
}
__ mocks __ / phaser.js:
const phaser = jest.genMockFromModule('phaser');
module.exports = phaser;
错误消息:
TypeError: Cannot read property 'position' of undefined
1 |
> 2 | const phaser = jest.genMockFromModule('phaser');
| ^
3 |
4 | module.exports = phaser;
at Image.get [as x] (node_modules/phaser/src/physics/matter-js/components/Transform.js:36:30)
at Array.forEach (<anonymous>)
at Array.forEach (<anonymous>)
at Array.forEach (<anonymous>)
at Array.forEach (<anonymous>)
at Array.forEach (<anonymous>)
at Object.<anonymous> (src/__mocks__/phaser.js:2:21)
at Object.<anonymous> (src/main.ts:3:1)
at Object.<anonymous> (src/main.spec.ts:3:1)
我正在查看该Transform文件及其在getter上的爆炸,因为this.body未定义:
get: function ()
{
return this.body.position.x;
},
还有其他人有这个问题吗?我希望我的配置有误。
答案 0 :(得分:0)
我想感谢您分享与Phaser 3一起运行Jest的配置。
关于您的问题,看来Phaser.Physics.Matter.Commponents.Trasnform
组件与jest.genMockFromModule()
的工作方式确实不兼容。
您只需在body
中为Transform
实例的phaser/src/physics/matter-js/components/Trasnform.js
属性的默认值创建默认值即可破解它:
var Transform = {
body: Body.create({}),
// ...
尽管我不知道它如何影响生产代码。
如果您在游戏中不使用Matter.js物理引擎,则可以改为创建custom Phaser 3 build。