0

로컬 JavaScript 파일을 원격 URL과 어떻게 테스트 할 수 있습니까? 나는 이것을 며칠 동안 켜고 껐다. 그러나 아직 그것을 이해할 수는 없다. 성공적으로 코드를 확인하기 위해유닛이 원격 URL에 대한 로컬 JavaScript 파일을 테스트합니다.

document.querySelector('p').textContent = 'This is a test.'; 

을 나는 다음과 같은 http://example.com/ 등의 원격 URL에 대해이 테스트 할 수 있습니다 방법 :

나는 등 포함 app.js라는 하나로서, DOM 조작과 로컬 파일을 가지고 실행됩니까? URL은 내가 제어하는 ​​URL이 아닙니다. 아마도 Selenium을 포함하는 솔루션이 가장 적합 할 것이지만 원격 URL에 대해 내 로컬 JS 파일을 실행하는 방법을 잘 모르겠습니다. 이러한이 의사 코드와 같은

:

openUrl('http://example.com/', function() { 
    inject('./app.js'); 

    element = document.querySelector('p'); 

    assertEquals('This is a test.', element.textContent); 
}); 

내가 캐스퍼 JS를 사용하여 시도 (팬텀 JS의 기반으로) 그게 가장 유망한 이었지만, 전에로드를 완료 할 수있는 DOM 기다리지 않습니다 어설 션을 실행하기 때문에 jQuery $ (document) .ready() 블록 안에있는 것은 아직 실행되지 않습니다.

여기 캐스퍼 JS에서 얻은 내용이 있습니다. ready() 블록에서 실행되기 때문에 두 번째 어설 션이 실패합니다.

// app.js 
$ = require('jquery'); 

$('p').first().text('test'); 

$(document).ready(function() { 
    $('h1').text('one'); 
}); 

그리고 : 만약 당신이 좋아하면

// test.js 
var url = 'http://example.com/'; 
var script = 'Example/app.js'; 

casper.test.begin('Test', function suite(test) { 
    casper.start(url, function() { 
    casper.page.injectJs(script); 

    // 'test' was added immediately, in app.js. This succeeds. 
    test.assertTextExists('test'); 

    // 'one' runs in a $(document).ready() block. This assertion fails. 
    test.assertTextExists('one'); 
    }); 

    casper.run(function() { 
    test.done(); 
    }); 
}); 
+2

도대체 것은하지 *로 실행? –

+0

로컬 호스트가 아닌 내 컴퓨터에있는 URL. – Gary

+0

http://jasmine.github.io/2.4/introduction.html –

답변

0

나는 캐스퍼 (Keper)를 사용하고 결국 casper.wait(100)을 사용하여 DOM을 기다리는 문제를 해결했습니다.

일부 샘플 코드 (이 코드는 테스트하지는 않았지만 제대로 작동해야하며 실제 코드는 훨씬 더 복잡합니다.) 의미 * "원격 URL에 대해"casperjs test casper.js

casper.js

// Begin test suite. 
casper.test.begin('Example', function(test) { 
    // Start Casper. 
    casper.start(); 

    // Open URL. 
    casper.thenOpen('http://example.com/', function() { 
    casper.page.injectJs('inject.js'); 
    }); 

    // Call the test. Wait for code to finish first. 
    casper.wait(100, function() { 
    test.assertExists('.element-added-by-injection'); 
    }); 

    // A second URL can even be opened. 
    casper.thenOpen('http://google.com/', function() { 
    casper.page.injectJs('google.js'); 
    }); 

    casper.wait(100, function() { 
    test.assertExists('.another-element-we-added'); 
    }); 

    casper.run(function() { 
    test.done(); 
    }); 
}); 

inject.js

var $ = require('jquery'); 

$(function() { 
    $('p').after('<div class="element-added-by-injection">Test</div>'); 
}); 
1

체크 아웃이에 jQuery를 실행 URL을로드 할 수는 머리가없는 브라우저를, phantom.js 및 수행은 주장한다.

그런 다음 로컬 환경을 테스트하고 리모컨에 대해 동일한 스크립트를 실행할 수도 있습니다.

phantom.js는 매우 유명하며 많은 플러그인이 있습니다.

+0

Phantom JS를 어떻게 사용합니까?나는 Casper JS를 통해 Phantom을 시도했고, 둘 다 JS를 원격 URL에 삽입 할 수 있기 때문에 거의 성공할 수 있었지만 DOM을 완성하지 않으므로 jQuery의 $ (문서)에있는 모든 코드가 완성되었다. ready() 블록이 너무 늦게 실행됩니다. – Gary

+0

글쎄, 준비된 이벤트가 필요 없다. 페이지가 이미 @Gary로드를 완료했기 때문에 스크립트를 실행한다. – webdeb

+0

내 스크립트를 준비 이벤트 내에서 실행해야한다. 그러나 캐스퍼 JS는 준비 이벤트를 기다리지 않으므로 준비 이벤트 내의 코드가 너무 늦게 실행됩니다. – Gary