2016-08-10 6 views
0

Я пишу класс C++ ScriptProcess, предназначенный для использования в QML, который выступает в качестве интерфейса для дочернего процесса. Указанный дочерний процесс загружает скрипт, а затем выполняет функции по требованию. Когда вы вызываете функцию, результат (будь то значение или исключение) возвращается асинхронно через сигналы.QML: Сигнал не вызывается в модульном тесте

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) 
    } 
} 

В двух словах, я делаю следующее:

  1. Для каждого теста, откройте добавочный процесс и загрузить сценарий из файла. Это делается путем создания экземпляра Component со сценарием, заданным через свойство ScriptProcess.code.
  2. Запустите тест.
  3. Когда тест завершается, убейте процесс и удалите объект, который его управляет.

Моя проблема заключается в том, что SignalSpy под названием exceptionSpy не запускается; exceptionSpy.count всегда ноль, и я понятия не имею, почему. Почему это так? Я злоупотребляю 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) 
}