2016-08-10 5 views
0

QML에서 사용되는 C++ 클래스 ScriptProcess을 작성 중이므로 하위 프로세스에 대한 인터페이스로 사용됩니다. 상기 하위 프로세스는 스크립트를로드 한 다음 요구에 따라 기능을 실행합니다. 함수를 호출하면 결과 (값 또는 예외 임)가 신호를 통해 비동기 적으로 반환됩니다. 각 시험QML : 단위 테스트에서 신호가 호출되지 않습니다.

  1. 의 auxillary 과정을 열고 파일에서 스크립트를로드 : 간단히 말해서
    import QtQuick 2.5 
    import QtTest 1.0 
    import dungeon 1.0 
    
    TestCase { 
        id: test 
        name: "ScriptProcessTest" 
    
        property ScriptProcess session: null 
    
        signal exceptionWhenLoadingCode(string type, int line, string message) 
    
        SignalSpy { 
         id: exceptionSpy 
         target: test 
         signalName: "exceptionWhenLoadingCode" 
        } 
    
        Component { 
         id: process 
    
         ScriptProcess { 
          id: script 
    
          onExceptionWhenLoadingCode: test.exceptionWhenLoadingCode(type, line, message) 
         } 
        } 
    
        function startScript(scriptUrl) { 
         var request = new XMLHttpRequest() 
         request.open("GET", "data/%1.js".arg(scriptUrl), false) 
         request.send(null) 
    
         return process.createObject(test, {code: request.responseText}) 
        } 
    
        function cleanup() { 
         if (session) { 
          session.stop() 
         } 
    
         delete session 
         session = null 
        } 
    
        function test_syntaxErrorInGlobalContextIsReported() { 
         var count = exceptionSpy.count 
         session = startScript("syntax-error-in-global-context") 
    
         compare(exceptionSpy.count, count + 1) 
        } 
    
        function test_errorThrownInGlobalContextIsReported() { 
         var count = exceptionSpy.count 
         session = startScript("error-in-global-context") 
    
         compare(exceptionSpy.count, count + 1) 
        } 
    } 
    

    , 나는 다음을 수행합니다. 이는 ScriptProcess.code 속성을 통해 제공된 스크립트로 Component을 인스턴스화하여 수행됩니다.
  2. 테스트를 실행하십시오.
  3. 테스트가 끝나면 프로세스를 종료하고이를 관리하는 개체를 삭제하십시오.

내 문제는 exceptionSpy이라는 이 트리거되지 않는 것입니다. exceptionSpy.count은 항상 0이며 나는 그 이유를 모릅니다. 왜 이런 경우입니까? SignalSpy 또는 Component을 잘못 사용하고 있습니까?

답변

1

XMLHttpRequest 비동기, 그래서 당신은 아마 같은 것으로 startScript()을 변경해야합니다 :

function startScript(scriptUrl) { 
    var object = process.createObject(test) 

    var request = new XMLHttpRequest() 
    request.onreadystatechange = function() { 
     if (request.readyState === XMLHttpRequest.DONE) 
      object.code = request.responseText 
    } 
    request.open("GET", "data/%1.js".arg(scriptUrl), false) 
    request.send(null) 

    return object 
} 

그리고 신호가 바로 방출하지 않을 때문에, 당신이 그것을 기다릴 대신에 비교해야 객체 생성 직후의 카운트 :

function test_foo() { 
    var count = exceptionSpy.count 
    session = startScript("...") 

    tryCompare(exceptionSpy, "count", count + 1) 
}