3

不知道是什么问题...

业力.conf.js

  files: [
  // TEMPLATES
  'app/scripts/directives/views/profile_picture.html',

  preprocessors : {
      // generate js files from html templates
      'app/scripts/directives/views/profile_picture.html': 'ng-html2js'
  },

  ngHtml2JsPreprocessor: {
      stripPrefix: 'app/',
      // setting this option will create only a single module that contains templates
      // from all the files, so you can load them all with module('templates')
      moduleName: 'templates'
  },

然后在我使用的测试中:

beforeEach(module('templates'));

我在指令中的 templateUrl 看起来像:

templateUrl: 'scripts/directives/views/profile_picture.html',

得到

Error: Unexpected request: GET scripts/directives/views/profile_picture.html

任何想法请这可能有什么问题或建议检查什么?

4

2 回答 2

3

我有同样的问题。确保您有完全匹配的文件。打开谷歌浏览器控制台,检查文件路径是否完全相同。

在此处输入图像描述

在上面的示例中,我必须在 ngHtml2JsPreprocessor.stripPrefix 中添加一个“/”字符串并且它起作用了。

于 2014-07-31T15:00:23.107 回答
0

@robharrisaz 是正确的。模板不能被视为原始 JS,这是 files 数组所期望的。<script>它需要围绕模板放置的 Angular包装器。

因此,您的期望是,通过在 files 数组中列出模板,当您的测试运行时,它已经包含在您的页面中。我假设您没有使用 ngMock 模块的 $httpBackend 服务处理获取此文件的请求。您可以通过以下两种方式之一解决此问题:

  1. 您可以通过其他方式将模板嵌入到您的页面中。您只需将其包装在一个脚本标记中,并以 URL 作为其 ID:

    <script type="text/ng-template" id="scripts/directives/views/profile_picture.html">
    ... YOUR TEMPLATE HTML HERE
    </script>
    
  2. 您可以包含 ngMock 并实现 $httpBackend。捕获此模板的 GET 请求,并返回模板(或返回您想要测试的替换 - 即 $httpBackend 的点)。您可以使用测试套件中的代码来执行此操作,如下所示。

    'use strict';
    
    describe('Templates', function() {
        var $httpBackend;
    
        beforeEach(function () {
            module('myApp');
            module('myApp.whatever');
    
            // Set up HTTP overrides for things like the emoji.json assets
            inject(['$httpBackend', function(_httpBackend) {
                $httpBackend = _httpBackend;
    
                // We don't actually need real contents, this is just a unit test
                $httpBackend.whenGET(/(.*)/).respond(function(method, url, data, headers) {
                    // Return a sample template so we can see what the caller does with it
                    return [200, '<div>' + url + '</div>'];
                });
            }]);
        });
    
        describe('myTemplate', function() {
            it('should load myTemplate when we navigate to /profile-picture', inject(['$rootScope', '$location', function($rootScope, $location) {
                $httpBackend.flush();
    
                // Trigger your action here. We have a view manager that we ask to load our template here
    
                expect(something).toEqual('something');
            }]));
        });
    });
    
于 2014-06-20T14:12:45.017 回答