2012-06-12 2 views
4

Я использую java для запуска Envjs для запуска модульных тестов javascript в Jasmine. Это позволит мне запускать тесты без браузера и упростить интеграцию в Jenkins (сервер непрерывной интеграции).Установка относительного window.location.href в envjs

У меня есть файл LoadSpecRunner.js (который запускается Envjs), который просто загружает фактический тестовый бегун жасмина, используя код, как показано ниже.

window.location.href = 'file:///c:/source/JasmineTest/SpecRunner.html'); 

Проблема заключается в том, что установка полный URL к файлу работает отлично, в то время как все мои попытки установки относительного пути не увенчались успехом. Ниже приведены некоторые из моих попыток установления относительного URL на выходе возвращается

window.location.href = Envjs.uri('../JasmineTest/SpecRunner.html'); 

или

window.location.href = '../JasmineTest/SpecRunner.html'; 

не удалось открыть файл: //c/source/JasmineTest/SpecRunner.html
Java Исключение: java.net.UnknownHostException: с

window.location.href = window.location.href; 

не удалось открыть файл: // с /:/Source/жасмином репортерам/О: пустой
JavaException: java.net.UnknownHostException: гр

Кто-нибудь есть какие-нибудь идеи?

Благодаря

Cedd

PS. Дальнейшее чтение на то, что я пытаюсь сделать:

http://skaug.no/ingvald/2010/10/javascript_unit_testing/

http://www.build-doctor.com/2010/12/08/javascript-bdd-jasmine/

ответ

1

я встретил ту же проблему и решить ее путем изменения env.rhino.1.2.js:

if (!base) { 
    base = 'file://' + Envjs.getcwd() + '/'; 
} 

->

if (!base) { 
    base = 'file:///' + Envjs.getcwd() + '/'; 
} 
+0

Ницца. Я не мог заставить это работать с путями типа «../specrunner.html» (например, пути, которые возвращают структуру дерева каталогов), но он работал с «specrunner.html». – cedd

0

Надеюсь, я понял ваш вопрос правильно - как же ниже посмотреть? (Возможно, вам нужно будет настроить baseURL, если у меня получится немного).

Функция;

function resolvePath (relativePath) { 
    var protocol = "file:///c:/"; 
    var baseUrl = "source/JasmineTest"; 
    var reUpward = /\.\.\//g; 
    var upwardCount = (relativePath.match(reUpward) || []).length; 
    return protocol + (!upwardCount ? baseUrl : baseUrl.split("/").slice(0, -upwardCount).join("/")) + "/" + relativePath.replace(reUpward, ""); 
} 

Примеры вызовов;

resolvePath("SpecRunner.html"); 
// "file:///c:/source/JasmineTest/SpecRunner.html" 
resolvePath("path/SpecRunner.html"); 
// "file:///c:/source/JasmineTest/path/SpecRunner.html" 
resolvePath("../../SpecRunner.html"); 
// "file:///c://SpecRunner.html" 
resolvePath("../SpecRunner.html"); 
// "file:///c:/source/SpecRunner.html" 
resolvePath("SpecRunner.html"); 
// "file:///c:/source/JasmineTest/SpecRunner.html" 

Здесь также более длинная версия, которая должна быть понятнее, это то же самое, что и resolvePath;

function longerVersionOfResolvePath (relativePath) { 
    var protocol = "file:///c:/"; 
    var baseUrl = "source/JasmineTest"; 
    var reUpward = /\.\.\//g; 
    var upwardCount = (relativePath.match(reUpward) || []).length; 

    var walkUpwards = upwardCount > 0; 
    var relativePathWithUpwardStepsRemoved = relativePath.replace(reUpward, ""); 
    var folderWalkedUpTo = baseUrl.split("/").slice(0, -upwardCount).join("/"); 

    if (walkUpwards) { 
    return protocol + folderWalkedUpTo + "/" + relativePathWithUpwardStepsRemoved; 
    } 
    else { 
    return protocol + baseUrl + "/" + relativePath; 
    } 
} 
+0

Привет, спасибо за интерес. Поскольку я понимаю этот код, он все же предполагает, что specrunner.html будет находиться на диске c и будет относиться к c: \ source \ jasminetest.У меня есть код на моей локальной машине в каталоге c: \ source \ smart \ jasmine \ etc, но сервер сборки имеет код в d: \ hudsonworkspace \ sharedworkspace \ smart \ jasmine \ etc. Я хочу разрешить путь относительно того, где файл loadpecrunner.js находится на диске ..... – cedd

+0

Для чего он стоит, я считаю, что это невозможно, но не стесняйтесь доказывать, что я ошибаюсь! – cedd