Three.js 使用Gulp+;带有ThreeJs库的Jasmine Testcase会导致自引用问题

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

我正在尝试使用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')
      .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插件,该插件在腰带下使用幻影浏览器或类似的浏览器,比如: