是否可以使用Jest测试旧的非模块JavaScript?

时间:2017-12-13 08:05:14

标签: javascript unit-testing jestjs

考虑一个旧项目(在我看来很常见):

final Button[] btnTemp = new Button[answers.length];
    final LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.HORIZONTAL);
    layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    gameL.addView(layout);
    for(int i = 0; i < answers.length; i++) {
        btnTemp[i] = new Button(getApplicationContext());
        btnTemp[i].setText(answers[i]);
        btnTemp[i].setTextColor(Color.parseColor("#ffffff"));
        btnTemp[i].setTextSize(getResources().getDimension(R.dimen.fab_margin));
        btnTemp[i].setPadding(0, 0, 0, 0);
        btnParams.setMargins(0,0,0,0);
        btnTemp[i].setBackgroundResource(R.drawable.round_shape_btn);
        btnTemp[i].setId(listLast);
        if(i != 2) {
            final int finalI = i;
            btnTemp[i].setLayoutParams(btnParams);
            layout.addView(btnTemp[i]);
        } else {
            Timer f = new Timer();
            final int finalI = i;
            f.schedule(new TimerTask() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(btnTemp[0].getWidth(),
                                    1000);
                            params.gravity = Gravity.CENTER;
                            btnTemp[finalI].setLayoutParams(params);
                            gameL.addView(btnTemp[finalI]);
                        }
                    });
                } }, 1000);

        }
}

的index.html

static/
   js/
      file1.js
      file2.js
      ....
   index.html

file1.js:

...
<script type="text/javascript" src="js/file1.js"></script>
<script type="text/javascript" src="js/file2.js"></script>
...

file2.js:

// publicly exposed class/function
var Person = function(name, age) {
    this.name = name;
    this.age= age;
}
Person.prototype.getName = function() {
    return this.name + '(' + this.age   + ')'
}

file1.js和file2.js的内容只是用于显示问题的虚拟内容。

是否可以编写表单测试?:

file2.test.js:

// publicly exposed function
var createPerson = function(name) {
    return new Person(name);
}

我尝试搜索将窗口/全局附加变量转换为模块导出的babel插件,同时尝试使用Jest&#39; setupFiles&#39;配置属性。 也许Jest不会为这种情况做准备,只是想不寻找另一个测试框架,因为我已经将Jest用于其他现代模块化应用程序。

如果不是如何测试这样的旧应用程序JavaScript - 我知道我可以使用Jasmine或Mocha并在浏览器中运行测试,但是希望在Node环境中进行测试,以便最终可以使用CI进行处理?

1 个答案:

答案 0 :(得分:0)

您需要将文件范围合并为当前上下文的一部分-例如通过将源同步加载并危险地eval到当前测试文件中-使以这种方式导入的任何内容都可以在那里进行测试(包括潜在的意外冲突和副作用),就像在非模块化全局窗口中那样上下文)。

const script = (url) => {
    const { protocol } = new URL(url, 'file://');
    switch (protocol) {
        case 'file:':
            return require('fs').readFileSync(`${process.cwd()}/${url}`, 'UTF8');
        case 'http:':
        case 'https:':
            return String(require('child_process').execSync(`wget -O - -o /dev/null '${url}'`))
        default:
            throw new Error('unsupported protocol');
    }
};

eval(script('js/file1.js'));
eval(script('js/file2.js'));

// ... tests