如何配置rhino为angularjs控制器运行jasmine测试

如何配置rhino为angularjs控制器运行jasmine测试,angularjs,scala,sbt,rhino,Angularjs,Scala,Sbt,Rhino,我在使用Jasmine sbt插件为Angular JS应用程序进行单元测试时遇到困难 当我将angular.js(1.3.1版)添加到test.dependecies.js时 EnvJasmine.loadGlobal(EnvJasmine.libDir + "/angular.js"); EnvJasmine.loadGlobal(EnvJasmine.libDir + "/ui-bootstrap-0.11.2.js"); EnvJasmine.loadGlobal(EnvJasmine.

我在使用Jasmine sbt插件为Angular JS应用程序进行单元测试时遇到困难

当我将angular.js(1.3.1版)添加到test.dependecies.js时

EnvJasmine.loadGlobal(EnvJasmine.libDir + "/angular.js");
EnvJasmine.loadGlobal(EnvJasmine.libDir + "/ui-bootstrap-0.11.2.js");
EnvJasmine.loadGlobal(EnvJasmine.testDir + "/lib/angular-mocks.js");
我犯了以下错误

[Envjs/1.6(Rhino;U;Linux amd64 3.13.0-32-generic;en-US;rv:1.7.0.rc2)Resig/20070309 PilotFish/1.2.13] 无法读取文件:/opt/scala/myproject/src/main/webapp/static/js/lib/angular.js 错误为:TypeError:在对象[object HTMLDocument]中找不到函数querySelector


我不知道angular和rhino是否存在兼容性问题,或者jasmine配置中是否存在兼容性问题

Domino基于Mozilla的Andreas Gal的工作,目前似乎仍在维护中。虽然它不是现成的,但很容易修补。我所作的修改如下:

参考资料


运行现代应用程序(角度/主干)使用rhino和/或Htmlun测试服务器端我曾经尝试过。但在我看来,使用node(和一个真正的JS引擎)来启动测试是最简单、最快的方法。rhino没有最新的规格,这对你来说可能是一条非常非常漫长的路,很有可能在最后找到一堵墙。你好。你用Rhino解决了这个问题吗?我也有同样的问题,我想这是否值得努力,还是最好是因果报应。我确信现在对于OP来说已经太晚了,但是现在有一个对sbt jasmine插件的挑战。我怀疑它是rhino,就像它是env.js一样。正如@PierreGayvallet所指出的,令人遗憾的是,rhino/env.js组合项目已经在地平线上消失。 Change files to use AMD style loading instead of CommonJS (so I can load them in Rhino and the browser using RequireJS) Add xmlns attribute to SVG element when serializing Modified the CSS parser to workaround a issue in Rhino with case insensitive regular expressions Added a SVG element type which has a style property like the HTML elements Added SVG specific CSS properties to the CSS parser Several bug fixes
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.tools.shell.Global;

import com.google.common.base.Charsets;

public abstract class RunJS {
    static final Log LOG = LogFactory.getLog(RunJS.class);

    static final int JS_VERSION = Context.VERSION_1_8;
    static final int OPTIMIZATION_LEVEL = 9;

    private static ScriptableObject ENVIRONMENT = null;

    static {
        ENVIRONMENT = createNewEnvironment();
    }

    /**
     * Creates a top level scope with the shell globals and requirejs then loads
     * bootstrap.js
     * 
     * The bootstrap script can then load other modules to be included in the top level
     * scope using requirejs
     */
    public static ScriptableObject createNewEnvironment() {
        Global global = null;

        Context cx = Context.enter();
        try {
            cx.setOptimizationLevel(OPTIMIZATION_LEVEL);
            cx.setLanguageVersion(JS_VERSION);

            global = new Global();
            global.setSealedStdLib(true);
            global.init(cx);

            Scriptable argsObj = cx.newArray(global, new Object[] {});
            global.defineProperty("arguments", argsObj, ScriptableObject.DONTENUM);

            // Enable RequireJS
            loadJS(cx, global, "/path/to/r.js");

            // Load the bootstrap file
            loadJS(cx, global, "/path/to/bootstrap.js");

            global.sealObject();
        } catch (Exception e) {
            LOG.error("Error setting up Javascript environment", e);
        }
        finally {
            Context.exit();
        }
        return global;
    }

    public static void loadJS(Context cx, Scriptable scr, String fileName) throws Exception {
        Reader reader;
        try {
            reader = new InputStreamReader(new FileInputStream(new File(fileName)), Charsets.UTF_8);
        } catch (FileNotFoundException e) {
            throw new Exception("Could not find file", e);
        };

        try {
            cx.evaluateReader(scr, reader, fileName, 0, null);
        } catch (IOException e) {
            throw new Exception("IO error reading file", e);
        }
        finally {
            try { reader.close(); } catch (IOException e) {
                throw new Exception("IO error closing file", e);
            }
        }
    }

    protected static Scriptable getScope(Context cx) {
        Scriptable scope = cx.newObject(RunJS.ENVIRONMENT);
        scope.setPrototype(RunJS.ENVIRONMENT);
        scope.setParentScope(null);
        return scope;
    }
}

boostrap.js

require.config({
    baseUrl: '/base/path/to/packages'
});

var window, document, d3;

require(['domino/index'], function(domino) {
    window = domino.createWindow('');
    document = window.document;

    require(['d3/d3'], function(_d3) {
        d3 = _d3;
    });
});

// preload your modules
require(["mypackage/mymodule1", "mypackage/mymodule2"]);

Subclass RunJS and load your JavaScript file like this:

Context cx = Context.enter();
try {
    cx.setOptimizationLevel(OPTIMIZATION_LEVEL);
    cx.setLanguageVersion(JS_VERSION);

    Scriptable scope = getScope(cx);
    scope.put("myvar", scope, myvar);
    loadJS(cx, scope, "/path/to/yourcode.js");
}
catch (Exception e) {
    LOG.error(e);
}
finally {
    Context.exit();
}