Three.js 使用Gulp+;带有ThreeJs库的Jasmine Testcase会导致自引用问题
我正在尝试使用three.js将一些测试用例添加到项目中。 我要测试的单元使用3.Vector3 我设置了一个用于测试jasmine库的Gulp任务 我的吞咽文件如下所示:Three.js 使用Gulp+;带有ThreeJs库的Jasmine Testcase会导致自引用问题,three.js,requirejs,jasmine,gulp,Three.js,Requirejs,Jasmine,Gulp,我正在尝试使用three.js将一些测试用例添加到项目中。 我要测试的单元使用3.Vector3 我设置了一个用于测试jasmine库的Gulp任务 我的吞咽文件如下所示: var jasmine = require('gulp-jasmine'); var gulp = require('gulp'); var three = require('../three'); gulp.task('test', function() { return gulp.src('jasmine.js
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\dodecader\deodecader\three.js:8:1)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
at Module.require(Module.js:364:17)
根据需要(模块js:380:17)
反对。(E:\gamesprogrammierung\dodecader\deodecader\test\gulpfile.js:7:13)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
由于gulp file runner不是一个浏览器,它显然无法获得对self的引用,
在three.js文件的开头使用
var THREE = THREE || { REVISION: '58' };
self.console = self.console || {
info: function () {},
log: function () {},
debug: function () {},
warn: function () {},
error: function () {}
};
在加载three.js之前,我试图覆盖self变量
var self = self || {
console: function () {}
};
但同样的错误也出现了。在我看来,require建立了自己的上下文,因此定义的自变量没有任何效果
有人知道我怎样才能让它工作吗?我自己解决了。首先我把要求的方法弄错了。这只用于装载 nodejs模块。因此,用require加载three.js javascript文件是错误的。 但是我安装了一个three.js节点模块
npm install three
然后用它在吞咽文件中
var THREE = require('three')
但问题仍然存在,错误在于没有定义三。
为了解决这个问题,我添加了另一行
GLOBAL.THREE = THREE;
通过它,我向nodejs上下文添加了一个全局变量
现在有三个js可用
为了让我的测试用例调用我的一个方法,我必须添加到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(…)
但是这三个.js文件需要变量“self”和“window”。
这可能会被覆盖。
var self={console:function(){}
var window={requestAnimationFrame:function(){}
但是gulp jasmine需要窗口变量未定义才能正常工作。
这是minijasminenode/lib/jasmine-version.js中的第一行,带有var isCommonJS定义
因此,在加载three.js之后,必须将window变量设置为undefined,
这应该也能起作用。有一个类似的问题,试图测试我的自定义浏览器库(而不是node.js),我想知道测试non-node.js代码的正确解决方案是否是使用gulp jasmine插件,该插件在腰带下使用幻影浏览器或类似的浏览器,比如: