在使用Require的JavaScript上运行Grunt的Jasmine测试

时间:2014-07-16 11:09:00

标签: javascript node.js gruntjs jasmine

我正在为lodash写一些扩展。与此问题相关的代码可以从here下载。结构是代码位于/shared/modules/myExtensions.js中。目前,我的代码非常基本,看起来像这样:

'use strict';

var _ = require('lodash');
_.mixin({
  'myFunction' : function(s) {
    return 'Hello ' + s; 
  }
});

module.exports = _;

我的代码将变得越来越复杂。出于这个原因,我想从一开始就设置单元测试。现在,我的测试位于/shared/tests/myExtensions.tests.js。那个文件看起来像这样:

'use strict';

describe('myModule', function() {
  it('should work', function() {
    expect(true).toBe(true);
  });
});

此测试始终断言为true。我正试图通过grunt执行这个Jasmine测试。当我通过Grunt执行此操作时,出现错误。该错误让我感到困惑,因为grunt-jasmine-node模块在我的package.json文件中定义。我还检查了当我运行npm install时它已经下载了。无论哪种方式,这是错误:

>> Local Npm module "grunt-jasmine-node" not found. Is it installed?

Running "jasmine:testShared" (jasmine) task
Testing jasmine specs via PhantomJS

>> Error: notloaded: Module name "../" has not been loaded yet for context: _. Use require([])
>> http://requirejs.org/docs/errors.html#notloaded at
>> ..\..\C:\Tests\jasmine\_SpecRunner.html:21
>> ..\..\C:\Tests\jasmine\.grunt\grunt-contrib-jasmine\require.js:12 v
>> ..\..\C:\Tests\jasmine\.grunt\grunt-contrib-jasmine\require.js:26 h
>> ..\..\C:\Tests\jasmine\.grunt\grunt-contrib-jasmine\require.js:31
>> ..\..\C:\Tests\jasmine\node_modules\glob\examples\g.js:1
>> Error: notloaded: Module name "../" has not been loaded yet for context: _. Use require([])
>> http://requirejs.org/docs/errors.html#notloaded at
>> ..\..\C:\Tests\jasmine\_SpecRunner.html:21
>> ..\..\C:\Tests\jasmine\.grunt\grunt-contrib-jasmine\require.js:12 v
>> ..\..\C:\Tests\jasmine\.grunt\grunt-contrib-jasmine\require.js:26 h
>> ..\..\C:\Tests\jasmine\.grunt\grunt-contrib-jasmine\require.js:31
>> ..\..\C:\Tests\jasmine\node_modules\glob\examples\usr-local.js:1
>> ReferenceError: Can't find variable: module at
>> ..\..\C:\Tests\jasmine\node_modules\glob\glob.js:37
>> Error caught from PhantomJS. More info can be found by opening the Spec Runner in a browser.
Warning: SyntaxError: Parse error Use --force to continue.

Aborted due to warnings.

这太令人沮丧了。我的代码可以从here下载。我已经为此工作了2天了。如果我今天没有完成它,我将不得不回到.NET。有人可以帮我解决这个问题吗?我真的想继续朝着这个方向前进。我相信这只是一个非常小的东西。

1 个答案:

答案 0 :(得分:3)

Andy指出,grunt-jasmine-node中没有定义

package.json

您可以使用将修复该错误的命令npm-install --save grunt-jasmine-node来定义和安装它。

此问题可能与https://github.com/gruntjs/grunt/issues/232有关。

此外,您可能希望分离您的开发依赖项和正常依赖项。

npm install --save-dev module包含' devDependencies'中的模块。配置和

npm install --save moduledependencies配置中包含package.json中的模块。

我希望这能解决你的问题,我正在寻找500赏金。

修改

编辑:

在我看来,您正在将客户端库与服务器端混合使用。

即您包含这样的供应商路径:

文件:tasks / options / jasmine.js

options: {
         specs: "shared/tests/unit/**.tests.js",
         // server libs
         vendor: "node_modules/**/*.js",
         // should be browser libs
         // vendor: "shared/libs/lodash/dist/lodash.js",
         }

所有node_modules文件夹都包含在浏览器中。 你真正应该做的是在shared/libs中定义你的库 并将该路径用于vendor选项。

您可以使用bower自动安装它们。

最后是你的实际代码,

var _ = require('lodash');
_.mixin({
  'myFunction' : function(s) {
    return 'Hello ' + s;
  }
});

module.exports = _;

这又是服务器端代码,它被加载到浏览器中。 你应该为浏览器写这个。