我正在尝试使用three.js为项目添加一些测试用例。 我试图测试的单位使用THREE.Vector3
我设置了一个Gulp任务,用于使用jasmine库进行测试。
我的gulp文件如下所示:
var jasmine = require('gulp-jasmine');
var gulp = require('gulp');
var three = require('../three');
gulp.task('test', function() {
return gulp.src('jasmine.js')
.pipe(jasmine());
});
其中require('../ three')正在加载three.js库。
问题是我收到了错误:
ReferenceError:未定义self 在对象。 (E:\ gamesprogrammierung \ dodecaeder \ Deodecaeder \ three.js所:8:1) 在Module._compile(module.js:456:26) at Object.Module._extensions..js(module.js:474:10) 在Module.load(module.js:356:32) 在Function.Module._load(module.js:312:12) 在Module.require(module.js:364:17) at require(module.js:380:17) 在对象。 (E:\ gamesprogrammierung \ dodecaeder \ Deodecaeder \测试\ gulpfile.js:7:13) 在Module._compile(module.js:456:26) 在Object.Module._extensions..js(module.js:474:10)
由于gulp文件运行器不是浏览器,显然它无法获得对self的引用, 在three.js文件的开头使用。
var THREE = THREE || { REVISION: '58' };
self.console = self.console || {
info: function () {},
log: function () {},
debug: function () {},
warn: function () {},
error: function () {}
};
我在加载three.js
之前试图覆盖自变量var self = self || {
console: function () {}
};
但出现同样的错误。在我看来,需要建立自己的上下文,因此定义的自变量无效。
有人知道如何才能让它发挥作用吗?
答案 0 :(得分:1)
我自己解决了。首先我得到了require方法错误。这仅适用于装载 nodejs模块。所以用require加载three.js javascript文件是错误的。 但是我有一个由
安装的three.js节点模块npm install three
然后在gulp文件中使用它
var THREE = require('three')
然后还有问题,错误来了,没有定义三个。 为了解决这个问题,我添加了另一行
GLOBAL.THREE = THREE;
我通过它向nodejs上下文添加了一个全局变量。
现在有三个j。
要让我的测试用例调用我的一个方法,我必须添加到jasmine测试文件
fs = require('fs')
myCode = fs.readFileSync('../my-utilsThreeJs.js','utf-8')
eval(myCode)
我的方法在my-utilsThreeJs.js中定义。
这是我的测试方法:
fs = require('fs')
myCode = fs.readFileSync('../my-utilsThreeJs.js','utf-8')
eval(myCode)
describe('Vertice count', function() {
it('test', function() {
vertices = new Array();
verticeOne = new THREE.Vector3(0.0,5.0,0.0);
verticeTwo = new THREE.Vector3(5.0,0.0,0.0);
vertices[vertices.length] = verticeOne;
vertices[vertices.length] = verticeTwo;
result = new THREE.Vector3(2.5,2.5,0.0);
expect(calculateCenter(vertices)).toEqual(result);
});
});
现在可以正确调用测试用例。
另一种可能性也可能是加载three.js文件 通过fs.readFileSync(...)
但是three.js文件需要变量' self'和'窗口' 这可能会被覆盖。 var self = {console:function(){}} var window = {requestAnimationFrame:function(){}}
但gulp-jasmine需要将窗口变量定义为未定义才能正常工作。 这是在minijasminenode / lib / jasmine-version.js中第一行用var isCommonJS定义,
所以在加载three.js后你必须将window变量设置为undefined, 这也应该有用。