【问题标题】:Test Angular Factory/Service Generated by Yeoman测试 Yeoman 生成的 Angular 工厂/服务
【发布时间】:2013-12-30 03:49:49
【问题描述】:

我用 yeoman 创建了一个应用

yo angular --minsafe

我想测试我创建的工厂/服务

yo angular:factory analyticsService

生成 /app/scripts/services/analyticsService.js

'use strict';

angular.module('angularPlaygroundApp')
  .factory('analyticsService', function ($resource) {
    // Service logic
    // ...

    var meaningOfLife = 42;

    // Public API here
    return {
      someMethod: function () {
        return meaningOfLife;
      }
    };
  });

和测试 /test/spec/services/analyticsService.js

'use strict';

describe('Service: Analyticsservice', function () {

  // load the service's module
  beforeEach(module('angularPlaygroundApp'));

  // instantiate service
  var Analyticsservice;
  beforeEach(inject(function (_Analyticsservice_) {
    Analyticsservice = _Analyticsservice_;
  }));

  it('should do something', function () {
    expect(!!Analyticsservice).toBe(true);
  });

});

运行 grunt 测试会为服务产生以下失败的测试

运行 "karma:unit" (karma) 任务 INFO [karma]: Karma v0.10.8 server started at http://localhost:8080/ INFO [启动器]: 启动浏览器 Chrome WARN [观察者]:模式 “/Users/lsims/projects/angular-playground/test/mock/*/.js”没有 匹配任何文件。信息 [Chrome 31.0.1650 (Mac OS X 10.9.0)]:已连接 在套接字 MTgYIXPHDT3JCSNU0ww9 Chrome 31.0.1650 (Mac OS X 10.9.0) 服务:Analyticsservice 应该做一些失败的错误: [$injector:unpr] 未知提供者:AnalyticsserviceProvider

我的问题是如何在 Angular 中测试工厂/服务,更具体地说,如何测试 Yeoman 生成的服务和/或工厂?

提前致谢

【问题讨论】:

  • 完全相同的问题。这是我与 Yeoman 的第一次体验,感觉很好,但是像这样的小问题正在吞噬我的夜晚。

标签: unit-testing angularjs yeoman


【解决方案1】:

它们的测试与您描述的完全一样。但是,JavaScript 是区分大小写的,并且您已经更改了注入器要搜索的内容的大小写。

analyticsService != 分析服务

_Analyticsservice_ 语法允许您将服务的文字值包含在下划线中,这样您就可以将局部变量命名为相同的东西。因此,向inject 询问_Analyticsservice_ 是在询问以字符串"Analyticsservice" 命名的服务。当您定义了名称为 "analyticsService" 的服务时。

所以,我想你想要:

'use strict';

describe('Service: analyticsService', function () {

  // load the service's module
  beforeEach(module('angularPlaygroundApp'));

  // instantiate service
  var analyticsService;
  beforeEach(inject(function (_analyticsService_) {
    analyticsService = _analyticsService_;
  }));

  it('should do something', function () {
    expect(!!analyticsService).toBe(true);
  });

injector 角度总是将名称 Provider 附加到管理对象的末尾。错误告诉您注入器找不到名称为 "AnalyticsserviceProvider" 的对象。

【讨论】:

  • 谢谢,就是这样。 Yeoman 做得很好,但它(和我)错过了大写。无论如何,服务、控制器、指令的约定是什么?它似乎因示例而异,例如MyCtrl 与 myCtrl,MyService 与 myService。
  • Angular 强制执行的唯一约定是在指令中命名。如果您使用驼峰式“myDirective”命名指令,那么您可以在 HTML 中以蛇形“my-directive”或驼峰式“myDirective”或(我认为)用冒号“my:directive”来引用它。这允许我们匹配不同的 HTML 标准。
  • @binarygiant:你不能因为错过大写而受到指责。生成器实际上把它搞砸了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2019-12-26
  • 2016-07-04
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
相关资源
最近更新 更多