Как я могу проверить директиву с помощью шаблонаUrl в браузере без головного мозга Chutzpah

Кто-нибудь знает, как получить безглавой браузер, такой как Chutzpah Visual Studio Test Adapter, чтобы разрешить доступ к его файлу-шаблону .html? Chutzpah использует PhantomJS для безгласного браузера, который, как представляется, ограничивает мои параметры.

Я использую Chutzpah Test Adapter 2.5 и AngularJS 1.2.0-r.2.

Я получаю сообщение об ошибке:

Неожиданный запрос: GET myApp/директивы/template.html

Что вызвано Angular попыткой использовать службу $http для доступа к моему шаблону директивы.

Я нашел несколько разных обходных решений:

Ни один из этих вариантов не удовлетворяет меня. Я бы предпочел, чтобы позволить директиве загружать свой шаблон прозрачно, чтобы я мог проверить его как компонент. Есть ли способ заставить этот сценарий работать?

Пример кода:

angular.module('myDirective', []).directive('myDirective', function() {
    return {
        restrict: 'E',
        transclude: true,
        templateUrl: 'myApp/directives/template.html',
        // Some other options, omitted for brevity.
    };
});

template.html:

<div><div ng-transclude></div></div>

Пример теста на жасмин:

describe('myDirective', function() {
    // Assign $scope using inject(), load module etc.
    // Insert workaround for $httpBackend loading my templateUrl here.
    it('should transclude content', function() {
        var element = $compile("<my-directive>Look Mom, I'm in my directive!</my-directive>")($scope);
        $scope.$digest();

        expect(element.text().trim()).toBe("Look Mom, I'm in my directive!");
    });
}

Ответы

Ответ 1

Мне удалось заставить его работать, используя опцию Chutzpah compile. Я поместил karma-ng-html2js-preprocessor в PowerShell script, а затем позвонил из Chutzpah, чтобы скомпилировать HTML в файлы JS.

Добавлен PowerShell script рядом с файлом настроек chutzpah.json(ниже script содержит непроверенную поддержку PreprendPrefix и StripSuffix)

# PowerShell port of https://github.com/karma-runner/karma-ng-html2js-preprocessor

Param (
    [parameter(Mandatory=$true)] [string] $Path,
    [string] $Module = '',
    [string] $StripPrefix = '',
    [string] $PrependPrefix = '',
    [string] $StripSuffix = ''
)

Function EscapeContent($content) {
    $content -replace "\\", "\\\\" -replace "'", "\'" -replace  "`r?`n", "\n' +`n    '"
}

Function Rename($fileName) {
    "$PrependPrefix" + ("$fileName" -replace "$StripPrefix", '' -replace "$StripSuffix", '' -replace "\\", "/")
}

$Template = If ("$Module" -eq "") {
    "angular.module('{0}', []).run(function(`$templateCache) {{`n" `
      + "  `$templateCache.put('{0}',`n    '{2}');`n" `
      + "}});`n"
  } Else {
    "(function(module) {{`n" `
        + "try {{`n" `
        + "  module = angular.module('{1}');`n" `
        + "}} catch (e) {{`n" `
        + "  module = angular.module('{1}', []);`n" `
        + "}}`n" `
        + "module.run(function(`$templateCache) {{`n" `
        + "  `$templateCache.put('{0}',`n    '{2}');`n" `
        + "}});`n" `
        + "}})();`n"
  }

Get-ChildItem $Path -Recurse -Filter *.html | Foreach-Object {
    $content = Get-Content $_.FullName | Out-String
    $content = EscapeContent $content
    $fileName = Rename "$($_.FullName)"
    ("$Template" -f "$fileName", "$Module", "$content") | Set-Content "$($_.FullName).js"
}

Добавлена ​​конфигурация скомпилировать в chutzpah.json и добавить "скомпилированные" JS файлы в ссылки (ссылка может быть добавлена ​​из тестового файла, но я предпочитаю использовать chutzpah.json для управления всеми ссылками )

{
    "References": [
        { "Path": "./path/to/templates/", "Include": "*.html.js" },
    ],
    "Compile": {
        "Extensions": [".html"],
        "ExtensionsWithNoOutput": [".html.js"],
        "SourceDirectory": "./path/to/templates",
        "OutDirectory": "./path/to/templates",
        "Executable": "%powershellexe%",
        "Arguments": "-NoProfile %chutzpahsettingsdir%\\chutzpah-ng-html2js-compiler.ps1 -Path '/path/to/templates/' -Module 'templates' -StripPrefix '.+(?=\\\\templates)'"
    }
}

В тестовых файлах загрузите модуль, в моем случае все они находятся в модуле шаблонов

beforeEach(module('templates'));
// or alternatively
beforeEach(module('/path/to/templates/foo.html'));

Ответ 2

вы можете использовать ссылку "шаблон" из Chutzpah

http://matthewmanela.com/blog/chutzpah-2-4-2/

/// <template path="../../MvcAngularJs1_3/ScriptsApp/directives/Templates/testTemplate.html" />
/// <reference path="../../mvcangularjs1_3/scripts/jquery-2.1.1.js" />
/// <reference path="../../mvcangularjs1_3/scripts/angular.js" />
/// <reference path="../../mvcangularjs1_3/scripts/angular-mocks.js" />
...

по ссылкам, то Chutzpah включает HTML непосредственно в тестовый HTML файл. Я дал своим шаблонам уникальный класс CSS, чтобы найти их и поместить их вручную в шаблон Template AngularJS Template Cache.

мой HTML-шаблон

<div class="row templateTestTemplate">
   <div class="col-lg-12">
       <h1>Tempalte Test</h1>
   </div>
</div>

директива

angular.module("testTemplateDirective", [])
    .directive("testTemplate", function() {
        return {
           restrict: 'A',
           replace: true,
           templateUrl: 'ScriptsApp/directives/Templates/testTemplate.html'
       }
});

в моем модуле Тесты Я использую jQuery для поиска Шаблона и добавления его в Template Cache. Angular firsts смотрит в кэш Template и не делает HTTP-вызов.

var template = jQuery(".templateTestTemplate")[0].outerHTML;
$templateCache.put("ScriptsApp/directives/Templates/testTemplate.html", template);

который отлично работает до сих пор, но работает только с chutzpah, когда вы запускаете этот тест с помощью Resharper, тест завершится неудачно, потому что resharper не копирует шаблон в тестовый HTML.

Я также просматриваю запрос на странице Chutzpah GitHub, чтобы окружить HTML тегами Script и идентификатором, чтобы вам не нужно было расширять шаблон https://github.com/mmanela/chutzpah/issues/330

Ответ 3

У меня была аналогичная проблема, пытающаяся проверить мои директивы. Я нашел решение, используя шаблон из https://github.com/vojtajina/ng-directive-testing.

Шаг 1: используйте плагин ng-html2js для компиляции шаблона angular в javascript Шаг 2: сделайте так, как ответил предыдущий ответ, и включите его в качестве модуля в вашем перед каждым.

ng-html2js также позволяет выполнять пользовательские манипуляции с "url", который он ожидает, что может быть полезно, если ваш тестовый каталог не совпадает с вашим каталогом приложений.

Ответ 4

Используя ng-html2js, это отличное видео, в котором показано, как получить все настройки для проверки директивы templateUrl. Я не уверен, насколько это применимо к Chutzpah, поскольку это пример Karma, но он может получить вас в правильном направлении!

https://vimeo.com/90876119

Ответ 5

Вы можете использовать jasmine-jquery для загрузки содержимого из файла или http в $templateCache. Он работает в Chutzpah без каких-либо изменений.

Сначала добавьте jasmine-jquery в ваш проект и добавьте chutzpah.json Ссылки:

(из моего кода)

"References" : [
    {"Path" : "vendor/jasmine-jquery-2.1.0.js"}
]

Затем в вашем тесте введите $templateCache и загрузите его "живым" контентом через jasmine.getFixtures() следующим образом:

beforeEach(inject(function ($templateCache) {
    //Loading template from live develop server
    jasmine.getFixtures().fixturesPath = "http://localhost:47152";
    var templateUrl = "/myApp/directives/template.html";
    $templateCache.put(templateUrl, jasmine.getFixtures()  
        .getFixtureHtml_(templateUrl));
}));

Если вы загружаете через http и используете Chrome для своих тестов, вы должны добавить поддержку CORS на сервере.

Ответ 6

Убедитесь, что вы включили свой шаблон в инжектор, прежде чем он будет создан. Так что попробуйте,

beforeEach(module('myApp/directives/template.html');