使用带有三个Js库的Gulp + Jasmine测试用例会导致自我参考问题

时间:2014-07-06 12:05:32

标签: three.js requirejs jasmine gulp

我正在尝试使用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 () {}
};

但出现同样的错误。在我看来,需要建立自己的上下文,因此定义的自变量无效。

有人知道如何才能让它发挥作用吗?

1 个答案:

答案 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, 这也应该有用。