通过测试了解Angular的`inject`

时间:2014-05-27 17:24:16

标签: angularjs

查看Mastering Web Applications in AngularJS的示例:

angular.module('archive', [])
  .factory('notificationsArchive', function () {
     var archivedNotifications = [];
     return {
        archive:function (notification) {
            archivedNotifications.push(notification);
        },
        getArchived:function () {
            return archivedNotifications;
        }};
  });

然后,模块的测试:

describe('notifications archive tests', function () {
   var notificationsArchive;

   beforeEach(module('archive'));

   beforeEach(inject(function (_notificationsArchive_) {
        notificationsArchive = _notificationsArchive_;
   }));

   it('should give access to the archived items', function () {
       var notification = {msg: 'Old message.'};

    notificationsArchive.archive(notification);

    expect(notificationsArchive.getArchived())
          .toContain(notification);
    });
});

第二个beforeEach(inject ...发生了什么?

2 个答案:

答案 0 :(得分:2)

beforeEach(inject(function (_notificationsArchive_) {
    notificationsArchive = _notificationsArchive_;
}));

在每次测试之前,只需说出一个notificationArchive实例。然后,它将该实例分配给可在实际测试用例中使用的变量。 notificationsArchive周围的下划线只是语法糖,因此您不必为测试用户的变量提供另一个名称。

答案 1 :(得分:2)

它将notificationsArchive服务注入到一个函数中,该函数将该服务分配给本地变量" notificationsArchive"在每次测试之前。名称中的下划线将被忽略。

https://docs.angularjs.org/api/ngMock/function/angular.mock.inject