如何在javascript中测试var函数

How to test a function in var in javascript

本文关键字:测试 var 函数 javascript      更新时间:2023-09-26

给定如下代码段,从钢筋js

var RL = {};
(function(global) {
    var sampleWeighted = function(p) {
        var r = Math.random();
        var c = 0.0;            // cumulative prob
        for(var i=0, n=p.length; i<n; i++) {
            c += p[i];
            if (c >= r) { return i; }
        }
        // assert(false) may happen if sum(p) < 1;
        assert(false, 'wtf');
    };
// many content omitted
...
})(RL);
export default RL;

我如何访问sampleWeighted并对其进行测试?

import RL from './rl.js';
it('sampleWeighted', () => {
    expect(RL.sampleWeighted([0.5, 0.5])).toEqual(1);
});

但是它报错了

 FAIL  src/lib/rl.test.js
  ✕ sampleWeighted (1ms)
  ● sampleWeighted
    TypeError: _rl.RL.sampleWeighted is not a function
      at Object.<anonymous> (src/lib/rl.test.js:7:46)
      at process._tickCallback (internal/process/next_tick.js:103:7)

我是新的javascript测试。目前,我正在使用create-react-app来设置测试框架。那么,测试上述函数的正确方法是什么呢?如果你碰巧了解sampleWeighted是做什么的,也请随意评论。

sampleWeighted在您的IIFE(立即函数调用语法)的闭包中

这种方式你可以保持你的方法私有像private public在Java中,注意你已经传递全局是RL,你可以把它作为你的命名空间,如果你想调用sampleWeighted,你需要将sampleWeighted附加到RL

...
RL.sampleWeighted = function() {}
...

在闭包中编写代码,使我们的测试代码能够访问我们关心的私有函数,但是当我们部署到生产环境中时删除这些代码。在这里,您可以准确地编写代码,您希望它在发布时呈现的样子,然后添加您需要的任何桥接代码,以公开您想要测试的部分。

如果你正在使用构建系统,你可以这样做

var RL = {};
(function(global) {
    var sampleWeighted = function(p) {
        var r = Math.random();
        var c = 0.0;            // cumulative prob
        for(var i=0, n=p.length; i<n; i++) {
            c += p[i];
            if (c >= r) { return i; }
        }
        // assert(false) may happen if sum(p) < 1;
        assert(false, 'wtf');
    };
    var api = {
        bar: function() {
            // public function `bar` returned from closure
            return "bar"
        }
    };
    /* test-code */
        api._foo = foo
    /* end-test-code */
    return api    
})(RL);
export default RL;

然后你可以使用"grunt-strip-code"

npm install grunt-strip-code --save-dev

然后在你的Gruntfile中启用它:

grunt.loadNpmTasks('grunt-strip-code');

grunt.initConfig({
  strip_code: {
    options: {
      start_comment: "test-code",
      end_comment: "end-test-code",
    },
    your_target: {
      // a list of files you want to strip code from
      src: "dist/*.js"
    }
  }
})

grunt.registerTask("test", [
  "concat",
  "jshint",
  "jasmine"
])
grunt.registerTask("deploy", [
  "concat",
  "strip-code",
  "jshint",
  "uglify"
])

参考- https://philipwalton.com/articles/how-to-unit-test-private-functions-in-javascript/

在您的IIFE中,您没有将sampleWeighted附加到传入对象(全局)。所以一定要在你的生活中做如下的事情:

global.sampleWeighted = sampleWeighted;
同样,在您的测试文件中,您需要使用: 访问该函数:
RL.sampleWeighted