QML: сигнал не вызывается в модульном тесте

Я пишу класс C++ ScriptProcess, предназначенный для использования в 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)
}
Другие вопросы по тегам