首页 文章

使用带有ThreeJs库的Gulp Jasmine Testcase会导致自我参考问题

提问于
浏览
0

我正在尝试使用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:未在Object中定义self . (E:\ gamesprogrammierung \ dodecaeder \ Deodecaeder \ three.js:8:1)在Module._compile(module.js:456:26)的Object.Module._extensions..js(module.js:474:10)at at 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 \ test \ 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 () {}
};

但是出现了同样的错误 . 在我看来,需要 Build 自己的上下文,因此定义的自变量不起作用 .

有人知道我怎么能让这个工作?

1 回答

  • 1

    我自己解决了 . 首先我得到了require方法错误 . 这仅适用于加载nodejs模块 . 所以用require加载three.js javascript文件是错误的 . 但是我安装了一个three.js节点模块

    npm install three
    

    然后在gulp文件中使用它

    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);
    
        });
    });
    

    现在可以正确调用测试用例 .

    另一种可能是通过fs.readFileSync(...)加载three.js文件

    但是three.js文件需要变量'self'和'window' . 这可能会被覆盖 . var self = {console:function(){}} var window = {requestAnimationFrame:function(){}}

    但gulp-jasmine需要将窗口变量定义为未定义才能正常工作 . 这是在minijasminenode / lib / jasmine-version.js中第一行用var isCommonJS定义,

    因此,在加载three.js后,您必须将窗口变量设置为undefined,这也应该有效 .

相关问题