2016-11-15 6 views
0

Я использую Karma для запуска тестов против некоторого кода.Использование текстового плагина RequireJS

Оба теста и код передаются (ES6 => ES5, используя babel), прежде чем они будут запущены кармой.

Это отлично работает, и тесты проходят нормально.

Но если я пытаюсь использовать плагин text! любой из файлов, протестированных ...

import template from 'text!./template.html'; 

... Я получаю:

There is no timestamp for /base/src/text.js! 
Uncaught Error: Script error for "text", needed by: text!app/template.html_unnormalized2 
http://requirejs.org/docs/errors.html#scripterror 
Uncaught Error: Load timeout for modules: text!app/template.html_unnormalized2 

Кто-нибудь есть какие-либо идеи, почему это возможно?

Встроенный артефакт в папке dist (т.е. элемент тестируемого) содержит успешно закодированный текст RequireJS элементов, например:

define('text!app/template.html',[],function() { return '<div>foo</div>';}); 

Дополнительной информации

тест-главной. js

var TEST_REGEXP = /(spec|test)\.js$/i; 
var allTestFiles = []; 
Object.keys(window.__karma__.files).forEach(function(file) { 
    if (TEST_REGEXP.test(file)) { 
    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, ''); 
    allTestFiles.push(normalizedTestModule); 
    } 
}); 

require.config({ 
    baseUrl: '/base/src', 
    paths: {},  
    shim: {}, 
    deps: allTestFiles, 
    callback: window.__karma__.start 
}); 

karma.conf.js

module.exports = function(config) { 
    'use strict';  
    var path = require('path');  
    var cdn = 'http://localhost:55635/modules/'; 
    var basePath = path.dirname(__filename); 

    config.set({ 
     basePath: '../../..', 
     frameworks: [ 
      'requirejs', 
      'jasmine' 
     ], 
     files: [ 
      { 
       pattern: path.join(basePath, 'test-transpiled', '*-spec.js'), 
       included: false 
      }, 
      path.join(basePath, 'dist', 'artifacts', 'app.js'), 
      path.join(basePath, 'test', 'unit', 'test-main.js') 
     ], 
     proxies: { 
      '/cdn/': cdn 
     }, 
     exclude: [], 
     preprocessors: {}, 
     reporters: ['dots'], 
     colors: true, 
     autoWatch: false, 
     singleRun: false, 
     browsers: ['Chrome'], 
    }); 
}; 

Edit:

Я добавил следующее karma.conf.js:

files: [ 
    { 
    pattern: path.join(basePath, 'node_modules/require-plugins/text/text.js'), 
    included: false 
    }, 
    // ... 
], 

Я по-прежнему получаю сообщение об ошибке при проведении испытаний:

There is no timestamp for /base/src/text.js! 

Предположительно, потому что мне нужно добавить «текст» в раздел путей в test-main.js?

require.config({ 
    baseUrl: '/base/src', 
    paths: { 
    'text': '../node_modules/require-plugins/text/text' 
    }, 
    // ... 
}); 

Но я пробовал различные комбинации baseUrl и путь в text пути, и я не могу получить его, чтобы остановить 404-джеинга.

ответ

1

Ваш files вариант в karma.conf.js не включает плагин text, поэтому вы получаете сообщение об ошибке, что для него нет отметки времени.

Добавить товар в список files, который попадает на плагин text, и убедитесь, что у вас есть included: false. Плагины RequireJS похожи на другие модули: RequireJS должен иметь возможность загружать их для их использования.

Возможно, вам понадобится установить paths в test-main.js в зависимости от того, где вы разместили свой плагин. RequireJS уже ищет его по адресу /base/src/text.js. Если вы найдете его так, чтобы плагин был загружен по этому URL-адресу, тогда нет необходимости устанавливать paths. Если вы поместите его в другое место, вам нужно установить paths.Что-то вроде:

paths: { 
    text: 'path/to/text', 
} 

Помните, что дорожки в paths интерпретируются относительно вашей установки baseUrl.

+0

Нужно ли добавить элемент в 'paths' в' test-main.js' тоже? ('' text ':' ... '') – Ben

+0

Я отредактировал свой ответ. – Louis

+0

Плагин находится в 'node_modules/require-plugins/text/text.js'. Однако я не уверен, как лучше всего ссылаться на это из теста. Все, что я пробовал 404s. – Ben

0

Я пробовал использовать текст require.js! плагин, а также обнаружил, что он конфликтует с baseUrl, определенным для остальной части проекта.

requirejs.config устанавливает baseUrl в родительский каталог JS-файлов, в то время как мои шаблоны определены в каталоге sibling для js. Невозможно было указать requirejs для загрузки шаблонов из/base/templates и js из base/js.

Моим решением было изменить плагин text.js и добавить крючок, чтобы изменить URL-адрес непосредственно перед вызовом ajax для извлечения HTML-файла. Вы можете взять мою версию text.js от here.

Смежные вопросы