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)
}
}
В двух словах, я делаю следующее:
- Для каждого теста откройте вспомогательный процесс и загрузите скрипт из файла. Это делается путем создания экземпляра
Component
со сценарием, данным черезScriptProcess.code
имущество. - Запустите тест.
- Когда тест завершится, завершите процесс и удалите объект, который им управляет.
Моя проблема в том, что 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)
}