angularjs - 如何配置 rhino 为 angularjs Controller 运行 jasmine 测试

标签 angularjs scala sbt rhino

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

当我将 angular.js(ver 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 ] Could not read file: /opt/scala/myproject/src/main/webapp/static/js/lib/angular.js error was: TypeError: Cannot find function querySelector in object [object HTMLDocument].

我无法确定 angular 和 rhino 或 jasmine 配置是否存在兼容性问题

最佳答案

使用维护的项目,例如 Domino:

Domino is based on work by Mozilla's Andreas Gal and appears to be currently maintained. While it didn't work out of the box, it was easy to patch. The modifications which I made were as follows:

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

引用资料

关于angularjs - 如何配置 rhino 为 angularjs Controller 运行 jasmine 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26799364/

相关文章:

javascript - 范围值不反射(reflect)在 View 中

javascript - Scala.js 运行时编译为 Javascript

scala - Akka-Http Websockets : How to Send consumers the same stream of data

scala - 使用 akka-persistence : growing state as list? 的事件溯源

scala - 在 SBT 中设置目标 JVM

sbt - 如何在插件自己的项目中使用SBT插件?

javascript - 在页面加载时加载 angularjs View ?

javascript - 在 Angular 中从 nodejs 获取 JSON

html - 禁用html中输入标签的自动填充?

scala - sbt - scala 项目 dockerization 中的问题