业力中的茉莉花测试:未捕获的ReferenceError:未定义require

时间:2013-10-01 13:10:28

标签: javascript karma-runner jasmine-node

Karma无法识别JSFileSpec.js文件中的'require'语句。运行karma.conf.js:

(function() {
    describe("DummyEmitter creation", function(){
        return it("creation", function(){
            var DummyEmitter = require('Util.DummyEmitter');
            var dummy = new DummyEmitter('someName');
            return expect(dummy).toBeDefined();
        });
    });
})();

ReferenceError:未定义require

7 个答案:

答案 0 :(得分:46)

当我尝试在测试用例中使用require('module_name')(CommonJS样式模块)并使用Karma运行它时,我遇到了同样的问题。

原因是浏览器无法使用require功能(undefined)。为了将它提供给浏览器,我们可以在Karma使用karma-browserify在浏览器中运行测试用例之前浏览测试js文件。

使用npm install karma-browserify --save-dev

安装karma-browserify

更新 karma.conf.js

 frameworks: ['jasmine', 'browserify'],
 preprocessors: {
    'app/tests/*.js': [ 'browserify' ]
 },
 plugins: [..., 'karma-browserify'],

在这些更改之后,浏览器通过Karma在浏览器中运行浏览器文件,其中require已定义,测试用例成功运行

答案 1 :(得分:22)

你可能正在使用一个在karma&bin目录中拾取内容的glob模式。尝试使用绝对路径执行测试,看看是否能修复它。

如果是这样,那么你知道你的glob模式正在抓住你不想要的东西。

例如更改

{pattern: '**/**/*_test.js'},

{pattern: 'stuff/dashboard/home-page_test.js'},

看看是否能解决您的问题。

答案 2 :(得分:7)

Karma是一个在浏览器中运行测试的测试运行器。无论您设置什么浏览器都不知道需要的功能是什么。

使用jasmine和node try jasmine-node。 https://github.com/mhevery/jasmine-node

要让业力运行茉莉花节点测试,请尝试(等待它......)jasmine-node-karma。 https://npmjs.org/package/jasmine-node-karma

这是我找到上述信息的茉莉花维基页面。 https://github.com/pivotal/jasmine/wiki

希望这有帮助。

答案 3 :(得分:2)

我今天遇到过类似的问题。就我而言,解决方案非常简单。我通过Webpack使用Babel来处理.jsx文件。扩展名为.jsx的文件测试成功,而简单的.js文件则引发了参考错误。

如果任何人有类似或相同的设置,他们可能能够共享相同的解决方案。

在karma.config.js中,我必须像.jsx那样为.js文件指定预处理器。这是一个例子:

preprocessors: {
  "app/tests/**/*.test.jsx": ["webpack", "sourcemap"],
  "app/tests/**/*.test.js": ["webpack", "sourcemap"]
},

我最好补充一点,在我的情况下,Webpack将代码传递给Babel进行编译,以便它可以在浏览器中运行。如果有人需要,我可以复制并粘贴整个webpack.config.js和karma.config.js。

答案 4 :(得分:0)

我为此目的使用webpack。我在npm上发布了我的配置,以节省我未来项目的时间。只需运行npm install webpack-karma-jasmine,然后按照文档中所述创建webpack和karma的配置文件:https://www.npmjs.com/package/webpack-karma-jasmine

答案 5 :(得分:0)

map( ( [ routerState, state ] ) => {
  const tenantKey = routerState.params[ 'tenantKey' ];
  if ( state ) {
    if ( state && state.id === tenantKey ) {
      return {
        type: '[TenantClubContext] Tenant Context Check Valid',
        payload: state
      };
    } else {
      return new LoadContextAction( tenantKey );
    }
  } else {
    return new LoadContextAction( tenantKey );
  }
} ),
catchError( err => {
  return of( { type: '[TenantClubContext] Error', payload: err } );
} )

使用webpack

答案 6 :(得分:-1)

如果有人仍然无法解决上述解决方案,这对我有帮助。纱线添加浏览器并观察