0

我目前正在尝试将 AngularJS 与 RequireJS 一起使用,但我不知道如何使测试与注入一起工作。如果没有 RequireJS,我们可以,

实施

PhoneListCtrl.$inject = ['$scope', '$http'];  
var PhoneListCtrl = ['$scope', '$http', function($scope, $http) { 
    /* constructor body */ 
}];  

测试

beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) {
  $httpBackend = _$httpBackend_;
  $httpBackend.expectGET('phones/phones.json').
      respond([{name: 'Nexus S'}, {name: 'Motorola DROID'}]);
  scope = $rootScope.$new();
  ctrl = $controller(PhoneListCtrl, {$scope: scope});
}));  

但是,当我们使用 RequireJS 时,我们可以将控制器定义如下,

演示控制器.js

define(["dependency"], function() {
    /* constructor body */ 
});

使用此控制器时,我们将其添加为依赖项之一,并且没有变量声明。(让我以“控制器”为例,因为我们最好将其称为“服务”)

一些JS.js

define(["demoController"], function(controller) {
     controller.method();
});

我的问题
在使用 RequireJS(AMD) 时,我们如何将 $http、$scope(或其他)注入目标控制器或服务进行测试?

任何帮助将不胜感激。

4

2 回答 2

1

我做过类似的事情:

/*global define, document */

define(['angular', 'jquery'], function (angular, $) {
    'use strict';

    return function () {
        var $injector = angular.bootstrap(document, ['myApp']);
        var $controller = $injector.get('$controller');
        var myController = $controller('myController');
    };
});

这个想法是 angular.bootstrap 返回一个注入器,它允许您获取服务。

于 2012-12-21T15:40:47.933 回答
0

我终于通过以下方式使其工作。

angular.module('app').controller('MyController', ['$scope', 'dep2', function              ($scope, dep2) {
    $scope.method = function () {//do something};
}]);

我们可以在这样的测试用例中使用这个控制器:

inject(function($controller, $rootScope, dep2) {
        scope = $rootScope.$new();
        myController = $controller("MyController",
                {
                    $scope : scope,
                    dep2: dep2
                });
);
于 2012-12-31T08:28:05.153 回答