2

我正在尝试设置我的 AngularJS 应用程序来测试控制器、路由、模板等,但是我在让angular-mocks.js提供的一些辅助方法工作(即moduleinject)时遇到问题.

我正在使用 testacular 加载测试套件,并在规范之前添加了以下文件:

files = [
  MOCHA,
  MOCHA_ADAPTER,
  '../application/lib/angular.min.js',
  './lib/angular/angular-mocks.js',
  './lib/angular/angular-scenario.js',
  '../application/application.js',
  './lib/chai.js',
  './lib/chai-should.js',
  './lib/chai-expect.js',
  './spec/**/*.js'
];

到目前为止一切顺利,但是当我运行测试时,我遇到了这个问题:

ReferenceError: Can't find variable: module

不确定这是在哪里加载的。我错过了什么吗?

4

2 回答 2

4

首先要检查的是所有这些文件都在测试浏览器中加载。在您的配置中出错并且没有意识到这一点非常容易。如果您使用 运行 testacular autowatch,您可以http://localhost:9876/context.html使用浏览器导航到并使用开发人员工具检查元素/资源/网络,看看是否缺少任何东西。

如果那里一切都很好并且您仍然遇到问题,请发布一些您的测试代码,我会看看。

更新:从angular-mocks.js(第 1635 行)源代码中的注释中(奇怪地)出现,window.module它仅适用于 Jasmine。看起来您使用的是 Mocha 而不是 Jasmine。这很可能是罪魁祸首。

回答:

我不能正确地相信这个 Matsko,因为你自己想出来了......但事实证明,当前的 AngularJS 稳定下载和 angular-seed 包含不支持 Mocha 的旧版本的 ngMock。用来自 github repo 的最新版本手动替换模拟文件可以解决问题。很高兴我能帮上忙 ;-)

于 2012-11-20T17:45:09.197 回答
1

我今天遇到了这个问题,我想向其他人提供完成此工作所需步骤的完整摘要。首先假设您有一个名为 myApp 的模块。在该模块内部有一个名为 myModel 的服务。myModel 服务有一个名为 getItems() 的方法。

  1. 目前,angular-mocks.js(我使用的是 AngularJS 1.0.6)不支持 Mocha。您需要访问此链接并将 1.0.6 版本替换为 AngularJS GitHub 项目的 master 分支中的版本。一个简单的方法(如果你有 wget)是wget https://raw.github.com/angular/angular.js/master/src/ngMock/angular-mocks.js在正确的目录中。如果您使用正确配置的 Sublime 或 vim,它也可以轻松地为您拉下它。
  2. 确保您的 karma.conf.js 文件在 files 数组中包含 angular-mocks.js 文件
  3. 在您的 tests.js 文件中的某处(可能在顶层描述)包含beforeEach(module('myApp'));或您命名主模块的任何内容。
  4. 如果您计划在多个地方使用该服务(或您想在测试中包含的任何内容),您可以在需要的地方调用另一个 beforeEach,如下所示:

beforeEach(inject(function(myModel) {
mymodel = myModel;
}));

否则你可以在需要的地方注入。现在 mymodel 变量(注意这是您在上面的 beforeEach 中分配的变量)将可供您在下一个块中进行测试。例如,您现在可以编写:

describe('when fetched', function() {
it('should return 3 items', function() {
// console.log(mymodel.getItems());
expect(mymodel.getItems()).to.have.length(3);
});
});

于 2013-04-13T20:48:35.483 回答