Angular指令测试 - 错误:[$ injector:modulerr]无法实例化模块?

时间:2014-11-06 07:54:06

标签: angularjs angularjs-directive jasmine

我正在使用Jasmine Standalone来测试我的Angular目录,

SimpleDirective.js

var app = angular.module("myApp", []);

app.controller('SimpleDirectiveController', function($scope) {
    $scope.customer = {
      name: 'Igor',
      address: '123 Somewhere'
    };
});

app.directive('helloWorld', function() {
    return {
        restrict: 'AE',
        replace: true,

        // Isolate scope:
        // separate the scope inside a directive from the scope outside, and then map the outer scope to a directive's inner scope. 
        scope: {
            customerInfo: '=info'
        },

        //templateUrl points to an external html template.
        templateUrl: 'fixture/hello.html'
    };
});

夹具/ hello.html的,

<div class="customer"><b>Hello</b> {{customerInfo.name}}</div>

SimpleDirectiveSpec.js,

describe("simpleDirective Test ", function(){

    // Boilerplate starts from here...
    var compile, scope, element;

    // Name of the module my directive is in.
    beforeEach(module('myApp'));

    // The external template file referenced by templateUrl.
    beforeEach(module('fixture/hello.html'));

    beforeEach(inject(function($compile,$rootScope) {

        compile = $compile;
        scope = $rootScope;

        element = angular.element('<div data-hello-world info="customer"></div>');
        compile(element)(scope);
        scope.$digest();
    }));
    // ...Boilerplate ends here

    it('renders the customer template', function() {
        var customer = element.find('.customer');
        expect(customer.length).toBe(1);
    });

});

我收到此错误,

  

错误:[$ injector:modulerr]无法实例化模块   fixture / hello.html由于:[$ injector:nomod]模块   'fixture / hello.html'不可用!你要么拼错了   模块名称或忘记加载它。如果注册模块,请确保   您将依赖项指定为第二个参数。

任何想法我错过了什么?

2 个答案:

答案 0 :(得分:3)

您应该为模板创建一个模块,并将模板html放入templateCache。

它应该是这样的:

angular.module("fixture/hello.html", []).run(["$templateCache", function($templateCache) {
  $templateCache.put("fixture/hello.html",
    "<div class=\"customer\"><b>Hello</b> {{customerInfo.name}}</div>");
}]);

如果您正在使用Karma进行测试,则会出现一个名为ng-html2js的自动化业力模块。

答案 1 :(得分:1)

我假设你正在使用karma html预处理器来处理html模板https://github.com/karma-runner/karma-ng-html2js-preprocessor。确保生成的模块具有与您声明的模块名称'fixture/hello.html'匹配的路径名。

您可以通过打开chrome developer console并检查source选项卡来验证文件,模块将作为js文件加载。确保生成的模块名称匹配。